객체지향언어란
1. 코드의 재사용성이 높다. (새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있다.)
2. 코드의 관리가 용이하다. (코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.)
3. 신뢰성이 높은 프로그래밍을 가능하게 한다. (제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며,
코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다.)
클래스와 객체
1. 클래스란
- '객체를 정의해놓은 것' , '객체의 설계도 또는 틀' => 클래스는 객체를 생성하는데 사용되며,
객체는 클래스에 정의된 대로 생성된다.
ex) 제품 설계도와 제품의 관계
클래스 | 객체 |
제품 설계도 | 제품 |
TV 설계도 | TV |
붕어빵 기계 | 붕어빵 |
- 클래스를 정의하고 클래스를 통해 객체를 생성하는 이유 :
하나의 설계도(클래스)만 잘 만들어 놓으면 제품(객체)을 만드는 일이 쉬워진다.
객체와 인스턴스
- 인스턴스 : 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고함
(객체는 모든 인스턴스를 대표하는 포괄적인 의미,
인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하는 보다 구체적인 의미 )
ex ) 아래표처럼 두 용어의 사용을 엄격히 구분할 필요는 없지만 문맥에 따라 구별하여 사용하는 것이 좋다.
'책상은 인스턴스다' | x (좋지 않은 예) |
'책상은 객체다' | o (좋은 예) |
'책상은 책상클래스의 객체이다' | x (좋지 않은 예) |
'책상은 책상 클래스의 인스턴스다' | o (좋은 예) |
객체의 구성요소 - 속성(멤버변수)과 기능(메서드)
- 객체는 속성과 기능 두종류의 구성요소로 이루어져 있음
- 객체가 가지고 있는 속성과 기능을 그 객체의 멤버(구성원, member) 라고 한다.
- 클래스에는 객체의 모든 속성과 기능이 정의되어 있다 -> 객체는 클래스에 정의된 속성과 기능을 가진다.
- 객체지향 프로그래밍에서는 속성과 기능을 각각 변수와 메서드로 표현한다.
속성 property | 멤버변수(member variable), 특성(attribute), 필드(field), 상태(state) |
기능 function | 메서드(method), 함수(function), 행위(behavior) |
ex) TV
속성 | 크기, 길이, 높이, 색상, 볼륨, 채널 등 | int channel |
기능 | 켜기, 끄기, 볼륨 높이기, 볼륨 낮추기, 채널 변경하기 등 | channelUp(){...} |
TV 클래스를 만든 예
class TV{
String color;
boolean power;
int channel;
void power() { power = !power; }
void channelUp() { chnnel++; }
void channelDown() { channel++; }
}
이렇게 클래스만 선언한 것은 TV설계도를 작성한 것에 불과하다.
TV인스턴스를 생성해야 제품을 사용할 수 있다.
클래스로부터 인스턴스를 생성하는 방법은 여러가지가 있지만 일반적으로는 아래와 같다.
클래스명 변수명; //클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); //클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장
Tv t; //Tv클래스 타입의 참조변수 t를 선언
t = new Tv(); //Tv인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장
Tv클래스로부터 인스턴스를 생성하고 인스턴스의 속성(channel)과 메서드(channelDown())를 사용하는 예
class TV{
String color;
boolean power;
int channel;
void power() { power = !power; }
void channelUp() { chnnel++; }
void channelDown() { channel++; }
}
class TvTest{
public static void main(String args[]){
Tv t;
t = new Tv();
t.channel = 7;
t.channelDown();
System.out.println("현재 채널은" + t.channel + "입니다"); // 6
}
}
** Tv t = new Tv(); 한문장으로 가능
t(참조변수).chnnel(인스턴스의 멤버변수) = 7 저장
t(참조변수).chnnelDown() (Tv인스턴스의 메서드호출)
** 인스턴스는 참조변수를 통해서만 다룰 수 있다. 참조변수의 타입은 인스턴스의 타입과 일치해야한다.
t2 = t1 ;
class TV{
String color;
boolean power;
int channel;
void power() { power = !power; }
void channelUp() { chnnel++; }
void channelDown() { channel--; }
}
class TvTest{
public static void main(String args[]){
Tv t1 = new Tv();
Tv t2 = new Tv();
t2= t1; //t1이 저장하고 있는 값(주소)을 t2에 저장한다.
t1.channel = 7;
system.out.println(t1.channel) //7
system.out.println(t2.channel) //7
}
}
t1은 참조변수이므로, 인스턴스의 주소를 저장하고 있다.
그럼 t2 가 가지고 있던 값은 잃어버리게 되고 t1이 참조하고 있던 인스턴스를 같이 참조하게 된다.
(참조변수가 하나도 없는 인스턴스는 더 이상 사용되어질 수 없으므로 '가비지 컬렉터' 에 의해서 자동적으로 메모리에서 제거된다.)
참조변수에는 하나의 값(주소) 만이 저장될 수 있으므로 둘 이상의 참조변수가 하나의 인스턴스를 가리키는(참조하는) 것은 가능하지만 하나의 참조변수로 여러 개의 인스턴스를 가리키는 것은 가능하지 않다.
자바의정석 요약
'Java' 카테고리의 다른 글
[java] java로 xml 다운로드 (0) | 2024.07.01 |
---|---|
[java] xml 생성 (1) | 2024.06.19 |
[java] pdf 생성 (0) | 2024.06.19 |
[java] xsl+xml 을 pdf파일로 변환하기 (0) | 2024.06.19 |
Java 타입 (0) | 2023.09.22 |