자바, 객체지향!

자바, 객체지향!

자바 프로그래밍의 꽃, 조립식 프로그래밍!

11 레퍼런스와 static

# 레퍼런스와 static ## 들어가며 --- 일반 변수와 객체를 가리키는 변수. ``` // 일반 변수 int score = 88; // 객체를 가리키는 변수 Cat cat1 = new Cat(); ``` 미묘하게 다른 듯하다. 어떤 차이가 있을까? ![클라우드스터딩-자바-레퍼런스형-vs-기본형-차이](https://i.imgur.com/ipbqku3.png) 이를 알아보기 위해 아래 내용을 학습해보자. 1. 레퍼런스 변수 2. 기본형 변수와의 차이 3. static 키워드 - 클래스 변수 - 클래스 메소드 ## 1. 레퍼런스 변수 --- 레퍼런스(reference) 변수는 객체를 가리킨다. ![클라우드스터딩-자바-레퍼런스-변수-예](https://i.imgur.com/gefY972.png) 엄밀히 말하면 객체의 주소 정보를 담고 있다. ``` // 객체 생성 후, 그 객체의 주소를 marine1 변수에 저장. 그 객체를 Marine 타입 으로 해석. Marine marine1 = new Marine("레이너", 80); // marine1 주소의 객체이 접근하여, stimpack() 동작을 실행 marine1.stimpack(); ``` ## 2. 기본형 변수와의 차이 --- #### 표기 방식? 레퍼런스 형은 대문자로 시작한다. 이와 반면, 원시형 변수는 소문자로 시작한다. #### 저장 방식? 레퍼런스 변수는 객체를 간접적으로 저장한다. 어떻게? 객체의 주소를 저장함으로써. ![클라우드스터딩-자바-레퍼런스-변수-기본형-차이](https://i.imgur.com/11oKvAf.png) 기본형(primitive) 변수는 값을 직접 저장한다. ``` int score = 88; double weight = 73.6; boolean isMale = true; char alphabet = 'A'; ``` ![클라우드스터딩-자바-기본형(primitive)-변수](https://i.imgur.com/TG4xzKb.png) #### 객체도 변수에 담으면 안되나? 객체는 하나의 변수에 담기에 너무 크다. 뿐만 아니라 그 크기가 유동적이다. 때문에 자바는 객체 접근을 위해 어드레싱(addresing) 방식 즉, 주소지를 통한 접근 방식을 취한다. ![클라우드스터딩-자바-레퍼런스(reference)-변수](https://i.imgur.com/7u3xPU9.png) ## 3. static 키워드 --- #### 무엇? static은 “공유”라는 개념을 담은 키워드이다. static은 클래스의 필드와 메소드에 적용될 수 있다. static 필드는 클래스 변수, static 메소드는 클래스 메소드라 부른다. ![클라우드스터딩-자바-static-필드-메소드](https://i.imgur.com/5PUlfws.png) #### 클래스 변수 vs 인스턴스 변수 클래스 변수(static 필드)는 클래스 영역에 존재한다. 객체 외부에 존재하므로 여러 객체가 공유에 좋다. ![클라우드스터딩-자바-클래스-변수-vs-인스턴스-변수-비교-차이-1](https://i.imgur.com/nRPLmri.png) 이와 반대로 non-static 필드는 "인스턴스 변수"라 부른다. 인스턴스 변수는 각 객체 내부에 존재한다. ![클라우드스터딩-자바-클래스-변수-vs-인스턴스-변수-비교-차이-2](https://i.imgur.com/IEOWjCp.png) 클래스 변수와 인스턴수 변수 선언 예. ``` public class Main { public static void main(String[] args) { Student std0 = new Student(2019122104, "Park"); Student std1 = new Student(2019206028, "Kim"); Student std2 = new Student(2019153237, "Lee"); } } class Student { // 클래스 변수 static int count = 0; // 인스턴스 변수 int id; String name; // 생성자 Student (int i, String s) { id = i; name = str; count++; } } ``` #### 클래스 메소드 vs 인스턴스 메소드 클래스 메소드(static 메소드)는 주체 객체 없이 실행된다. 간편한 기능 구현에 좋다. ![클라우드스터딩-자바-클래스-메소드-vs-인스턴스-메소드-비교-차이](https://i.imgur.com/VzzYQlZ.png) 그 대표적인 예로 <kbd>Math.random()</kbd>이 있겠다. ``` // Math의 static 메소드 random()을 호출 double rand = Math.random(); ``` 이와 반면 인스턴스 메소드는 주체 객체를 통해 수행된다. ``` // 인스턴스 메소드를 수행하려면 먼저, 주체 객체가 생성되야 한다. Student std4 = new Student(2007122104, "Choi"); // std4 변수에 연결된 객체가 주체가 되어, 인스턴스 메소드를 수행 std4.study(); ``` ## 요약 --- ![클라우드스터딩-자바-레퍼런스와-static-요약](https://i.imgur.com/8SjXUXO.png) #### 레퍼런스 변수 - 레퍼런스 변수란, 객체를 가리키는 변수다. - 기본형 변수는 값을 직접 저장하나, 레퍼런스 변수는 객체의 위치를 가리킨다. #### static 키워드 - static 키워드는 필드와 메소드에 적용될 수 있다. #### 클래스 변수 - 클래스 변수란, 클래스 영역에 존재한다. - 인스턴스 변수란, 객체 내부에 존재한다. #### 인스턴스 변수 - 클래스 메소드란, 주체 객체가 없이 수행되는 메소드다. - 인스턴스 메소드란, 주체 객체가 실행하는 메소드다. ## 확인하기 --- <div class="interact_responsive_padding" style="padding:100% 0 0 0;position:relative;margin-bottom:5px;"><div class="interact_responsive_wrapper" style="height:100%;left:0;position:absolute;top:0;width:100%;"><iframe id="interactApp5ce54fd17bcb600014fd74fa" width="100%" height="100%" style="border:none;max-width:100%;margin:0;" allowTransparency="true" frameborder="0" src="https://quiz.tryinteract.com/#/5ce54fd17bcb600014fd74fa/q/1?method=iframe"></iframe></div></div> ## 도서구매 <a href="http://www.yes24.com/Product/Goods/104740689"><img src="http://image.yes24.com/goods/104740689/XL" width="50%" /></a>

Challenge

개념 실습! 학습 내용을 진짜 내 것으로 만들기!