티스토리 뷰

1. 필드 사용


필드를 사용한다는 것은 필드값을 읽고, 변경하는 작업을 뜻한다.

외부에서 필드를 사용할 떄는 클래스로부터 객체를 생성한 뒤 필드를 사용해야 한다.

필드는 객체에 소속된 데이터이기 때문에 객체가 존재하지 않으면, 필드도 존재하지 않기 때문이다.


외부에서 필드를 사용할 때는 필드가 소속된 클래스를 우선 생성한 뒤,  


클래스명.필드명


으로 필드를 사용할 수 있다.

( . 은 도트 연산자를 뜻한다. 객체 참조시 자주 사용된다. )



필드 사용 예시


Building.java

public class Building{


String address = "경기도";

String company = "삼성";

int height = 300;

int room = 200;

int year = 1998;


int initialization1;

double initialization2;

String initialization3; 

int[] initialization4;

boolean initialization5;


}


BuildingEx.java

public class BuildingEx{

public static void main(String[] args){


Building building = new Building();             //객체 생성


//필드값 읽기

System.out.println("주소: " + building.address);

System.out.println("건설사: " + building.company);

System.out.println("높이: " + building.height + "m");

System.out.println("방의 개수: " + building.room + "개");

System.out.println("제작년도: " + building.year + "년");


//필드값 변경

building.room = 250;

building.height = 350;


System.out.println("수정된 방의 개수: " + building.room + "개");

System.out.println("수정된 높이: " + building.height + "m");


//필드값 자동 초기화 결과 ( c.f 클래스의 구조 포스팅)

System.out.println("int형 자동 초기화: " + initialization1);

System.out.println("double형 자동 초기화: " + initialization2);

System.out.println("String형 자동 초기화: " + initialization3);

System.out.println("int형 배열 자동 초기화: " + initialization4);

System.out.println("boolean형 자동 초기화: " + initialization5);


}

}




2. 생성자 사용


생성자는 필드를 초기화 할 때 주로 사용된다고 하였다. ( c.f 클래스의 구조) 

하지만, 필드를 선언할 때 초기화를 진행해주면 생성자의 존재는 무의미 한 것 아닌가? 라고 생각 할 수 있다.


필드를 선언할 때 초기값을 주게 되면 동일한 클래스로부터 생성되는 객체들은 모두 같은 데이터를 갖는다.

객체 생성 후 변경은 물론 가능하지만, 생성한 직후에는 필드의 값은 모두 같다.


그러나, 객체 생성 시, 외부에서 제공되는 값들로 초기화되어야 한다면 어떻게 해야 할까?

그 때, 생성자를 사용한다.

생성자는 간단하게, 객체 생성 시 필드를 다양한 값들로 초기화할 수 있도록 도와준다.

전 포스팅의 생성자 선언의 예시가 바로 그것이다.


외부에서 제공되는 다양한 데이터들을 이용하여 객체를 초기화하기 위해 생성자도 다양화될 필요성이 있다. 

하지만, 생성자는 오직 하나만 존재해야 하므로 이러한 요구 조건이 충족될 수 없다. 

이 문제를 해결하기 위해, 생성자는 오버로딩(Overloading)을 지원한다.


생성자 오버로딩이란  매개 변수를 달리하는 생성자를 여러 개 선언하는 것이다.

생성자 오버로딩 시 주의할 점은 매개 변수의 타입 및 개수, 선언 순서 중 하나는 달라져야만 한다.


다음은 생성자 오버로딩의 예이다.


Building.java

public class Building{


//필드

String address = "경기도";

int year = 1998;


String company;

int height;


//생성자 1

Building(){

}


//생성자 2

Building(String a){

company = a;

}


//생성자 3

Building(String a, int b){

company = a;

height = b;

}

}


BuildingEx.java

public class BuildingEx{

public static void main(String[] args){


Building building1 = new Building();             //객체 생성 (생성자1 호출)


//필드값 읽기

System.out.println("주소: " + building1.address);

System.out.println("제작년도: " + building1.year + "년");



Building building1 = new Building("현대");             //객체 생성 (생성자2 호출)


//필드값 읽기

System.out.println("주소: " + building2.address);

System.out.println("제작년도: " + building2.year + "년");

System.out.println("건설사: " + building2.company);



Building building3 = new Building("삼성", 200);             //객체 생성 (생성자3 호출)


//필드값 읽기

System.out.println("주소: " + building3.address);

System.out.println("제작년도: " + building3.year + "년");

System.out.println("건설사: " + building3.company);

System.out.println("높이: " + building3.height + "m");


}

}



위 코드에서 Building(String a, int b) 의 매개 변수를 a, b로 받았다.

매개 변수가 무엇을 의미하는지 알 수 있는가?

매개 변수를 알기 위해서는 BuildingEx.java로 돌아가서 확인해야 한다.


이러한 불편을 해소하기 위해서, 생성자에서는 this() 코드를 사용이 일반적이다.

this()는 자기 자신을 의미한다. 

this 코드는


this.필드 이름 


으로 사용한다.

this 코드를 사용하여 Building.java를 다음과 같이 변경가능하다.  (BuildingEx.java 의 코드는 동일하다.)


Building.java

public class Building{


//필드

String address = "경기도";

int year = 1998;


String company;

int height;


//생성자 1

Building(){

}


//생성자 2

Building(String company){

this.company = company;        //필드 company를 매개변수 company로 초기화한다.

}


//생성자 3

Building(String company, int height){

this.company = company;        //필드 company를 매개변수 company로 초기화한다.

this.height = height;                //필드 height를 매개변수 height로 초기화한다.

}

}



this()코드는 이 뿐만 아니라, 다른 생성자를 호출하여, 생성자 간 중복 코드를 방지하는 기능을 병행한다.

현재 Building.java 코드에서 생성자2와 생성자3는 this.company = company; 가 중복된다.

이러한, 중복코드의 발생을 막기 위하여 다음과 같이 변경 가능하다.


Building.java

public class Building{


//필드

String address = "경기도";

int year = 1998;


String company;

int height;


//생성자 1

Building(){

}


//생성자 2

Building(String company){

this(company, 300);                  //생성자3 호출.

}


//생성자 3

Building(String company, int height){

this.company = company;         //필드 company를 매개변수 company로 초기화한다.

this.height = height;                //필드 height를 매개변수 height로 초기화한다.

}

}


BuildingEx.java

public class BuildingEx{

public static void main(String[] args){


Building building1 = new Building();             //객체 생성 (생성자1 호출)


//필드값 읽기

System.out.println("주소: " + building1.address);

System.out.println("제작년도: " + building1.year + "년");



Building building2 = new Building("현대");             //객체 생성 (생성자2 호출)


//필드값 읽기

System.out.println("주소: " + building2.address);

System.out.println("제작년도: " + building2.year + "년");

System.out.println("건설사: " + building2.company);

System.out.println("높이: " + building2.height + "m");



Building building3 = new Building("삼성", 200);             //객체 생성 (생성자3 호출)


//필드값 읽기

System.out.println("주소: " + building3.address);

System.out.println("제작년도: " + building3.year + "년");

System.out.println("건설사: " + building3.company);

System.out.println("높이: " + building3.height + "m");


}

}


해당 기능을 하는 this의 사용은 생성자의 첫줄에서만 허용 가다는 점을 꼭 유의해야 한다.



3. 메소드 사용


메소드는 클래스 내, 외부의 호출에 의해 실행 된다.

클래스 내부의 다른 메소드에서 호출할 경우에는 메소드 이름으로 호출하면 된다.

하지만, 클래스 외부에서 호출할 경우, 필드와 동일하게 외부에서 필드를 사용할 때는 필드가 소속된 클래스를 우선 생성한 뒤,  


클래스명.메소드명


으로 메소드를 사용할 수 있다.


다음은 메소드 호출의 예이다.



Building.java

public class Building {


// 필드

String address = "경기도";

int year = 1998;

int height = 300;


// 메소드

String getAddr() {

return address;

}


// 메소드

void construct() {

for (int i = 0; i < height; i += 50) {

System.out.println("건물이 지어지고 있습니다!!\t" + i + "m");

}

System.out.println("건물이 완공되었습니다!! \t" + height + "m");

System.out.println("");

}


// 메소드 (클래스 내부의 다른 메소드에서 호출할 경우)

String getInfo() {

System.out.println("공사내역 보기");

construct();


System.out.println("빌딩정보");

return "주소: " + address + "\t 높이: " + height;

}


}



BuildingEx.java

public class BuildingEx {
public static void main(String[] args) {

Building building = new Building(); // 객체 생성 
String address =building.getAddr(); //메소드 getAddr 호출 후, address에 저장
System.out.println("주소: "+address);
building.construct();             //메소드 construct 호출
String info=building.getInfo(); //메소드 getInfo 호출후, info에 저장
System.out.println(info);
}
}



메소드에서도 생성자와 비슷하게 오버로딩을 지원한다.

메소드 오버로딩의 조건 또한 매개 변수의 타입, 개수, 순서 중 적어도 하나 이상은 달라야만 한다는 것이다.

메소드 오버로딩의 목적은 다양한 매개값을 받아 효율적으로 처리하는 것에 있다.


다음은 메소드 오버로딩의 예이다.


Building.java


public class Building {


// 필드

String address = "경기도";

int year = 1998;

int height = 300;


// 메소드

String getAddr() {

return address;

}


// 메소드

void construct() {

for (int i = 0; i < height; i += 50) {

System.out.println("건물이 지어지고 있습니다!!\t" + i + "m");

}

System.out.println("건물이 완공되었습니다!! \t" + height + "m");

System.out.println("");

}


// 메소드 (클래스 내부의 다른 메소드에서 호출할 경우)

String getInfo() {

System.out.println("공사내역 보기");

construct();


System.out.println("빌딩정보");

return "주소: " + address + "\t 높이: " + height;

}

//메소드 getInfo 오버로딩

String getInfo(String person) {

System.out.println("빌딩정보");

return "건물주: " + person + "\t 주소: " + address + "\t 높이: " + height;

}

}



BuildingEx.java


public class BuildingEx {


public static void main(String[] args) {


Building building = new Building(); // 객체 생성 

String address =building.getAddr(); //메소드 getAddr 호출 후, address에 저장

System.out.println("주소: "+address);

building.construct();             //메소드 construct 호출

String info=building.getInfo(); //메소드 getInfo 호출후, info에 저장

System.out.println(info);

String infoSimple = building.getInfo("아이린");

System.out.println(infoSimple);

}

}


'JAVA' 카테고리의 다른 글

싱글톤(Singleton)  (0) 2019.09.16
정적 멤버와 인스턴스 멤버  (0) 2019.09.16
클래스의 구조  (0) 2019.09.10
객체와 클래스  (0) 2019.09.10
객체지향 프로그래밍  (0) 2019.09.09
공지사항
최근에 올라온 글