<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 사용







 








+ Recent posts