이미 아시다시피 자바는 대표적인 객체지향 언어 중 하나입니다.
객체지향의 주요 특징은 다음과 같습니다.
1. 코드의 재사용성이 높다.
-새로운 코드를 작성할 때 기존의 코드를 사용하여 쉽게 작성할 수 있다.
2. 코드의 관리가 용이하다.
-코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.
3. 신뢰성이 높은 프로그래밍을 가능하게 한다.
-제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며,
코드의 중복을 제거하여 코드의 불일치로 인한 오작동을 방지할 수 있다.
이 중에서도 객체지향언어의 가장 큰 장점은 코드의 재사용성이 높고, 유지보수가 용이하다는 점인데,
앞으로 알아볼 여러가지 객체지향개념을 통해서 보다 쉽게 이해할 수 있을 것입니다.
그러면 이제 자바에서 어떻게 객체지향 프로그래밍을 하는지 알아보도록 합시다.
클래스와 객체
클래스란 쉽게 말하자면 '객체의 설계도'라고 많이들 이야기합니다.
클래스는 객체를 생성하는데 사용되며, 객체는 클래스에 정의된 대로 생성됩니다.
객체의 사전적인 의미는 '실제로 존재하는 것'인데, 프로그래밍에서의 객체는
클래스에 정의된 내용대로 '메모리에 생성된 것'을 이야기합니다.
실생활에서 예를 들면, TV의 설계도는 클래스이고, 이를 토대로 만들어진 TV는 객체라고 말할 수 있습니다.
당연하지만 TV의 설계도(클래스)와 TV(객체)는 엄연히 다른 것이니 유의하시길 바랍니다.
이렇게 설계도(클래스)로부터 제품(객체)을 만드는 과정을 클래스의 '인스턴스화'라고 말합니다.
또한 이렇게 클래스1에서 만들어진 객체1을 클래스1의 인스턴스라고도 합니다.
객체와 인스턴스는 사실상 같은 의미이며, 엄격히 구분할 필요는 없지만
문맥상 의미가 맞도록 구분하여 사용하시는 게 좋을 것 같습니다.
객체의 구성요소
객체는 속성과 기능의 두 가지 요소로 이루어져 있으며, 일반적으로 객체는 다수의 속성과 요소를 가집니다.
따라서 객체는 속성과 기능의 집합이라고 할 수 있으며, 이 속성과 기능들을 해당 객체의 멤버라고 합니다.
이러한 속성과 기능은 당연히 객체의 설계도인 클래스에 모두 정의되어 있습니다.
이 두 가지 단어를 속성은 '멤버변수', 기능은 '메서드'라고 부르도록 하겠습니다.
다시 실생활에서 TV를 예로 들어서 이해해봅시다.
TV의 경우 크기, 길이, 높이, 전원상태, 볼륨, 채널 등등을 멤버변수(속성)라고 할 수 있으며,
켜기, 끄기, 볼륨조절, 채널변경 등등을 메서드(기능)이라고 말할 수 있을 것입니다.
이제 실제로 VSC에서 TV클래스를 만들어보도록 합시다.
class Tv{
//TV클래스의 멤버변수
int height;
int width;
int volume;
int channel;
String color;
boolean power;
//TV클래스의 메서드
void power(){
power = !power;
}
void channelUp(){
channel += 1;
}
void channelDown(){
channel -= 1;
}
void volumeUp(){
volume += 1;
}
void volumeDown(){
volume -= 1;
}
}
위와 같이 TV클래스를 멤버변수와 메서드로 구분해서 생성할 수 있습니다.
power메서드의 겨우 power의 값이 true일 경우 false로, false일 경우 true로 만들어줍니다.
channel과 voluem관련 메서드의 경우 해당 멤버변수를 1씩 증가시키거나, 감소시키는 기능을 합니다.
객체 생성
이제 클래스를 만들었으니 TV클래스의 인스턴스, 즉 객체를 만들어서 사용해보도록 합시다.
일반적으로 클래스로부터 인스턴스를 생성하는 방법은 다음과 같습니다.
클래스명 변수명;
변수명 = new 클래스명();
Tv t;
t = new Tv();
물론 이를 한 줄로 합쳐서 Tv t = new Tv()와 같이 생성할 수도 있으니 자신이 편한 방법으로 하시면 됩니다.
class Tv{
//TV클래스의 멤버변수
int height;
int width;
int volume;
int channel;
String color;
boolean power;
//TV클래스의 메서드
void power(){
power = !power;
}
void channelUp(){
channel += 1;
}
void channelDown(){
channel -= 1;
}
void volumeUp(){
volume += 1;
}
void volumeDown(){
volume -= 1;
}
}
public class example{
public static void main(String[] args){
Tv t = new Tv();
t.channel = 7;
System.out.println("현재 채널은 " + t.channel + "입니다.");
t.channelDown();
System.out.println("현재 채널은 " + t.channel + "입니다.");
}
}
이렇게 간단한 코드로 클래스와 객체의 사용법을 알아봤습니다.
위와 같이 객체를 생성하게 되면 메모리 공간상에 해당 객체를 위한 공간이 마련됩니다.
그리고 이 공간의 시작 주소값이 t의 값이 되며, 이 t를 참조변수라고 합니다.
이 참조변수에 저장된 주소값을 통해 객체의 멤버변수와 메서드에 접근할 수 있습니다.
이는 배열에서 이미 알아봤던 내용이니 어렵지는 않을 거라 생각됩니다.
또한 객체가 생성되면 각 멤버변수는 해당 자료형의 기본값으로 자동으로 초기화됩니다.
객체의 멤버변수, 메서드에 접근하기 위해선 참조변수.멤버변수, 참조변수.메서드와 같이 사용하시면 됩니다.
위의 예제를 조금 바꿔서 살펴보고 마치도록 하겠습니다.
class Tv{
//TV클래스의 멤버변수
int height;
int width;
int volume;
int channel;
String color;
boolean power;
//TV클래스의 메서드
void power(){
if(power){
System.out.println("전원Off");
}else{
System.out.println("전원On");
}
}
void channelUp(){
channel += 1;
}
void channelDown(){
channel -= 1;
}
void volumeUp(){
volume += 1;
}
void volumeDown(){
volume -= 1;
}
}
public class example{
public static void main(String[] args){
Tv t1 = new Tv();
Tv t2 = new Tv();
t1.power();
t1.channelUp();
System.out.println("t1.channel = " + t1.channel + ", t2.channel = " + t2.channel + "입니다.");
t1.channel = 5;
t2 = t1;
System.out.println("t1.channel = " + t1.channel + ", t2.channel = " + t2.channel + "입니다.");
}
}
위에서 참조변수는 객체의 메모리 주소값을 저장하고 있다고 이야기했습니다.
때문에 예제에서 처럼 t1참조변수의 값을 t2참조변수에 대입하면
t2참조변수를 통해서 t1객체의 멤버변수와 메서드를 사용할 수 있습니다.
이와 같이 여러개의 참조변수가 하나의 객체를 가리킬 수 있습니다.
이때 사용되는 것은 t1객체뿐이며, t2객체는 사용되지 않는다는 점 주의하시길 바랍니다.
반대로 하나의 참조변수가 여러 개의 객체를 가리키는 것은 불가능합니다.
이번 글은 이상으로 마치고 다음에 이어서 알아보도록 하겠습니다.
감사합니다.
'프로그래밍 언어 > 자바' 카테고리의 다른 글
자바 14. 메서드 오버로딩 (0) | 2020.08.27 |
---|---|
자바 13. 변수의 종류, 메서드 (0) | 2020.08.26 |
자바 11. 배열-2 (0) | 2020.08.24 |
자바 10. 배열-1 (0) | 2020.08.14 |
자바 9. 반복문 (0) | 2020.08.13 |