클래스 Class
기존의 절차지향언어에서도 소스코드를 재사용하기 위한 함수가 존재하였습니다. 소스코드를 재사용한다는 것은 매우 많은 장점을 가지고 있죠. 이미 작성된 소스코드를 또 작성할 필요가 없기 때문에 시간도 절약되고 소스코드양도 줄어듭니다. 이미 검증된 소스코드를 재사용한다면 결함에 대한 걱정없이 소스코드를 마음놓고 활용할 수도 있죠. 또한 공동작업에서 (개인이 여러일을 하든 집단이 여러일을 하든) 이미 잘 알려진 재사용된 소스코드로 이해하기 쉽거나 의사소통에 원활한 장점을 가져다 줍니다. 그리고 공통부분에 대한 전체적인 수정이 필요할때 재사용되어지는 소스코드부분만 수정하면 재사용하는 모든 소스코드에 일괄적인 수정효과를 발생시킵니다.
객체지향언어에서는 이런 재사용을 더욱 극대화하기 위해 상태를 표현해주는 데이터와 동작을 표현해주는 처리를 한번에 모아서 객체라는것으로 표현하는 것입니다. 이 세상의 모든 것들은 객체(Object) 로 표현할 수 있습니다. 모든 사물이 상태와 동작으로 표현될 수 있으니까요. 이런 객체(Object) 는 실제로 구현되어 존재하는 것입니다. 클래스는 이러한 객체를 정의하는 것입니다.
가령 실제 세상에 존재하는 사과를 생각해 봅시다. 사과의 무게 색깔 향 을 상태로 표현하고 사과가 공중에서 놓으면 떨어지고 힘을주면 반으로 쪼개지고 깨물어 먹을때 '아삭'하는 소리가 나는것을 동작으로 표현해 봅시다. 우리는 모두 사과를 알기 때문에 머릿속에 사과의 무게,색깔,향 (상태) 와 떨어지고 쪼개지고 소리나는 것 (동작) 을 상상할 수 있습니다. 이것을 사과 클래스로 볼 수 있습니다. 그리고 실제 사과 2개가 테이블위에 있습니다. 이 사과 2개는 실제로 존재하기 때문에 각각의 사과 객체(Object) 입니다. 머릿속으로 정의된 클래스가 실제로 구현된 것이 객체(혹은 인스턴스)라고 볼 수 있습니다. 사과 한개는 그대로 두고 다른 사과를 한입베어 먹었습니다. 본래 2개는 같은 클래스로부터 실체화된 객체였는데 2개중 한개를 한입 먹었으므로 무게가 달라졌고 베어 문자리의 색깔이 달라졌습니다. 다시 온전한 사과를 한입 베어 물었습니다. 이제 사과 2개는 다시 무게가 같아졌고 베어문 자리의 색깔도 같아졌습니다. 이미 구현된 객체(인스턴스)가 독립적으로 움직이지만 본래 같은 사과 클래스였기때문에 같은 상태가 되거나 같은 동작을 할 수 있는 가능성이 있는 것입니다.
클래스는 상태를 나타내는 필드(데이터) 와 동작을 나타내는 메소드(처리) 로 구성되어 있습니다. 필드와 메소드는 클래스의 멤버라고 합니다. Book 클래스를 소스코드로 표현하면
class Book {
int price ;
int num ;
String title ;
int sum() {
return price * num ;
}
}
으로 표현할 수 있습니다. price,num,title 은 필드이고 sum() 은 메소드이고 앞의 것들은 모두 멤버입니다. 이 클래스는 정의(개념)이기 때문에 실체화된 존재가 아닙니다. 실제로 존재하기 위해서는 객체화(인스턴스 화) 되어야 합니다. 이것을 오브젝트 생성이라고 합니다. new 연산자를 통해 오브젝트를 생성할 수 있습니다.
Book book1 ; // Book 이라는 클래스 타입으로 book1 이라는 오브젝트 명을 정의합니다.
book1 = new Book( ); // book1 이라는 오브젝트 명은 Book 이라는 클래스로부터 오브젝트가 생성됩니다.
이렇게 줄여서 작성할 수도 있습니다.
Book book1 = new Book( );
Book book2 = new Book( );
book1, book2 는 같은 Book 클래스로부터 생성된 다른 오브젝트입니다.
book1 오브젝트의 필드에 실제 값을 넣어봅시다. 같은 오브젝트에서는 필드명을 그대로 사용하여 값을 대입하거나 참조할 수 있습니다.
price = 10000;
num = price + 10000;
다른 오브젝트의 필드를 참조하거나 대입하려면 .(피리오드) 를 사용합니다.
book2.price = 5000;
num = book2.price + 10000;
메소드는 처리동작입니다. 재료를 주면 처리를하여 결과를 반환합니다.
int add(int a, int b){ // add 메소드는 a, b 라는 int 형 재료를 받아서 처리한 뒤 int 형 결과를 반환합니다.
int x;
x = a + b; // 처리 방법
return x; // 반환(리턴)
}
반환(리턴) 값이나 재료(인수) 값이 없을 수도 있습니다. 리턴값이 없을경우 void 라고 지정합니다. 인수값이 없을경우는 ( ) 안을 공백으로 둡니다.
동일 오브젝트 내의 메소드를 호출할때는 메소드명과 인수값 리턴값을 메소드에 정의된대로 기술하여 사용합니다.
c = add(1,2);
다른 오브젝트의 메소드를 호출할때는 필드와 마찬가지로 .(피리오드)를 사용합니다.
c = book2.add(1,2);
이 내용은 ANK Co.,Ltd. 저 김성훈 역의 Java가 보이는 그림책에서 요약 발췌하였습니다.
'SW > Java' 카테고리의 다른 글
상속 오버라이딩 접근제한자 (0) | 2017.01.15 |
---|---|
오버로딩 생성자 메인메소드 (0) | 2017.01.15 |
반복문 for, while (0) | 2017.01.09 |
제어문 if, switch (0) | 2017.01.09 |
논리 연산자 (0) | 2017.01.09 |