<2> 생성자 (Constructor)
1. 두 명의 과일장수와 한 명의 구매자
1) 과일장수1 : 보유하고 있는 사과의 수 30개, 개당 가격은 1500원
과일장수2 : 보유하고 있는 사과의 수 20개, 개당 가격은 1000원
인 두명의 과일장수에서 '나' 가
"나는 과일장수1에게 4500원어치 사과를 구매했고, 과일장수2에게 2000원어치 사과를 구매했다" 를 실행할 예정
2) 문제점 : 두 개의 과일장수 인스턴스를 생성해야 하고 과일장수의 사과 보유 수 및 가격이 다르기 때문에 인스턴스 변수의 초기값도 달라져야 함
- > 인스턴스를 생성 하고 나서 인스턴스 변수 초기화. : FruitSeller class에 인스턴스 변수를 초기화 하는 initMember 메소드를 넣었다.
//참조변수 seller1과 seller2는 다르다! 같은 class 에서 각기 다른 주소에 각기 다른 객체 생성, 그 주소를 넘겨주는 것.
//FruitSeller seller1 = new FruitSeller();
FruitSeller seller2=seller1;
와 다르다
: 이 코드의 문제점
- 인스턴스를 생성하고 난 다음에 또 변수를 초기화 하기 때문에 2줄에 걸쳐서 문장을 구성해야 한다.
(많은 인스턴스가 생성되면 큰 문제점이 될 수 있음)
-FruitSeller 클래스의 인스턴스변수 APPLE_PRICE의 final선언이 없어짐.
-> 프로그래머가 실수로 final선언하지 못한 변수를 수정할 시에 치명적인 문제가 생길 수 있다
(메소드는 여러번 사용할수 있기 때문에 메소드 안에 final 변수는 초기화가 불가능하다.)
↓ 해결방안
2. 생성자(constructor)
: 딱 한번만 호출되는 메소드, 인스턴스변수의 초기화를 위해 정의됨. (final변수 선언 가능)
1) 생성자가 되기 위한 조건 :
- 클래스와 동일한 이름의 메소드
- 반환형이 선언되어 있지 않으면서, 반환하지 않는 메소드
2) 인스턴스가 생성될 때 마다 생성자가 호출되어야 한다. : 생성자는 딱 한번 호출된다.
- New Number : Number의 인스턴스 생성
- Number(); : Number() 생성자 호출
3. 생성자의 정의
1) 생성자는 다른 메소드들과 같이 값을 전달받을 수 있다. 받는형태도 자유
: 생성자를 사용하면 인스턴스 변수의 초기화를 한결 수월하게 진행할 수 있다!
4. 코드의 개선
내가 생성자를 사용해서 해본 것
- 책에 나온 코드 : FruitBuyer 클래스에서도 생성자를 사용했다
5. 생성자가 없어도 인스턴스 생성이 가능한 이유 : 디폴트 생성자(Default Constructor)
지난 게시물의 사과장수코드에서는 생성자가 정의되어 있지 않음에도 불구하고 FruitSeller seller=new Fruitseller(); 등등을 통해 인스턴스 생성 및 생성자 호출을 하였다. 그리고 인스턴스 생성과정에서는 반드시 생성자가 호출되어야 하는데 오류가 나지 않았던 이유 : 디폴트 생성자
1) 디폴트 생성자 : 프로그래머가 클래스 안에 생성자메소드를 삽입하지 않으면 자바컴파일러가 자동으로 삽입해 주는 생성자.
예시 ) FruitSeller의 디폴트 생성자
public FruitSeller()
{
// 텅 비어있다!
}
* 디폴트생성자는 public 일수도 있고 아닐수도 있다 -이후에 공부
<3> 자바의 이름 규칙 (Naming rule) : 문법과 관계는 없지만 다른 사람에게 보여주거나 다른 사람의 것을 볼 때 사용하는게 유용하다 (관례적인 표현)
1. 클래스의 이름 규칙 : 'Camel Case'
1) 첫문자는 대문자
2) 둘 이상의 단어가 묶여서 하나의 이름을 구성할 때 새로 시작하는 단어는 대문자
ex ) circle point -> CirclePoint
2. 메소드와 변수의 이름 규칙 : 클래스와 구분되어야 한다. 변형된 Camel Case
- 첫 문자를 소문자
ex ) addYourMoney, yourAge
3. 상수의 이름 규칙 : 구분이 되기 위해 모든 문자 대문자로 하는것이 관례
final int COLOR=7;
+) 단어가 연결되어야 하는경우 언더바
final int COLOR_RAINBOW=7;
문제 1.
아래의 문제에서 요구하는 클래스들을 정의하되, 위에서 설명한 Camel Case 이름 규칙을 적용하여 메소드와 변수, 클래스 이름 지어주기. 정의한 클래스 확인을 위한 main 메소드도 적절의 정의.
Q1. 밑변과 높이 정보를 저장할 수 있는 Triangle 클래스 정의. 생성과 동시에 초기화가 가능한 생성자도 정의. 밑변과 높이 정보를 변경시킬수 있는 메소드와 삼각형의 넓이를 계산해서 반환하는 메소드도 함께 정의
내가 만들어본 코드 :
책의 코드 : 변수 지정 간단하게, 밑변과 높이의 변경을 따로따로 했다. 중간에 확인하는 출력과정 없음
Q2. 구슬치기
다음 조건에 만족하는 클래스 정의
- 어린아이가 소유하고 있는 구슬의 갯수 정보 담을 수 있다
-놀이를 통한 구슬의 주고받음을 표현하는 메소드 존재
-어린이의 현재 보유자산(구슬의 수)을 출력하는 메소드 존재
두번째 조건은 두 아이가 구슬치기를 하는 과정에서 구슬을 잃고 얻음을 의미하는것. 위의 조건을 만족하는 클래스를 정의하였다면 다음 조건을 만족하는 인스턴스 각각 생성
- 어린이1의 보유자산 : 구슬 15개
- 어린이2의 보유자산 : 구슬 9개
인스턴스의 생성이 완료되면 다음상황을 main메소드 내에서 시뮬레이션
- 1차 게임에서는 어린이1은 어린이2의 구슬 2개 획득
- 2차 게임에서는 어린이2는 어린이1의 구슬 7개 획득
마지막으로 각각의 어린이가 보유하고 있는 구슬의 수 출력하면서 프로그램 종료.
- 내가 만든 코드
- 책의 코드 : 진 어린이가 줘야 하는 구슬 수가 어린이가 가진 구슬 수보다 클 때의 경우가 있다. -단순 변경이 아닌 return 사용
'언어 > JAVA' 카테고리의 다른 글
Chapter 8. 클래스 패스와 패키지 (1) (0) | 2017.05.26 |
---|---|
< Selection does not contain a main type 에러 > (2) | 2017.05.26 |
Chapter7. 클래스와 인스턴스 (0) | 2017.05.18 |
Chapter 6. 메소드와 변수의 스코프 (0) | 2017.05.14 |
Eclipse 설치 및 실행 (0) | 2017.05.11 |