※ 객체를 사용한다는 것은 객체가 가지고 있는 속성과 기능을 사용한다는 뜻
클래스 | 객체 |
---|---|
제품 설계도 | 제품 |
붕어빵 기계 | 붕어빵 |
TV 설계도 | TV |
속성(Proterty) 멤버변수(member variable), 특성(attribute), 필드(field), 상태(state)
기능(function) 메서드(method), 함수(function), 행위(behavior)
- ‘속성’ 보다는 ‘멤버면수’ ‘기능’보다는 ‘메서드’ 주로 사용
class Tv{
String color ; // 색깔
boolean power; // 전원상태
int channel; // 채널
void power() { power = !power;}
void channelUp() { channel++;}
void channelDown() { channel--;}
}
※ 멤버변수와 메서드를 선언하는데 있어서 순서는 관계없지만, 일반적으로 메서드보다는 멤버변수를 먼저 선언하고 멤버변수는 멤버변수끼리 메서드는 메서드끼리 모아 놓는 것이 일반적이다.
클래스명 변수명; //클래스의 객체를 참조하기 위한 참조변수를 선언
변수면 = new 클래스명(); //클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장
Tv t; // Tv클래스 타입의 참조변수 t를 선언
t = new TV(); // Tv인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장
package ch6;
class Tv{
// Tv의 속성(멤버변수)
String color; //색상
boolean power; //전원상태(on/off)
int channel; //채널
// Tv의 기능(메서드)
void power() {power = !power;} // TV를 켜거나 끄는 기능을 하는 메서드
void channelUp() { ++channel;} // TV의 채널을 높이는 기능을 하는 메서드
void channelDown() {--channel;} // TV의 채널을 낮추는 기능을 하는 메서드
}
public class TvTest {
public static void main(String[] args) {
Tv t; // Tv인스턴스를 참조하기 위한 변수 t를 선언
t = new Tv(); // Tv인스턴스를 생성한다.
t.channel = 7; // Tv인스턴스의 멤버변수 channel의 값을 7로 한다.
t.channelDown(); // Tv인스턴스의 메서드 channelDown()을 호출한다.
System.out.println("현재 채널은 " + t.channel + "입니다.");
}
}
인스턴스는 참조변수를 통해서만 다룰 수 있으며,
참조변수의 타입은 인스턴스의 타입과 일치해야한다.
package ch6;
class Tv{
// Tv의 속성(멤버변수)
String color; //색상
boolean power; //전원상태(on/off)
int channel; //채널
// Tv의 기능(메서드)
void power() {power = !power;} // TV를 켜거나 끄는 기능을 하는 메서드
void channelUp() { ++channel;} // TV의 채널을 높이는 기능을 하는 메서드
void channelDown() {--channel;} // TV의 채널을 낮추는 기능을 하는 메서드
}
public class TvTest2 {
public static void main(String[] args) {
Tv t1 = new Tv(); // Tv t1; t1 = new Tv();를 한 문장으로 가능
Tv t2 = new Tv();
System.out.println("t1의 channel값은" + t1.channel + "입니다.");
System.out.println("t2의 channel값은" + t2.channel + "입니다.");
t1.channel = 7; // channel 값을 7으로 한다.
System.out.println("t1의 channel값을 7로 변경하였습니다.");
System.out.println("t1의 channel값은" + t1.channel + "입니다.");
System.out.println("t2의 channel값은" + t2.channel + "입니다.");
}
}
같은 클래스로부터 생성되었을지라도 각 인스턴스의 속성(멤버변수)은 서로 다른 값을 유지할 수 있으며, 메서드의 내용은 모든 인스턴스에 대해 동일하다.
package ch6;
class Tv{
// Tv의 속성(멤버변수)
String color; //색상
boolean power; //전원상태(on/off)
int channel; //채널
// Tv의 기능(메서드)
void power() {power = !power;} // TV를 켜거나 끄는 기능을 하는 메서드
void channelUp() { ++channel;} // TV의 채널을 높이는 기능을 하는 메서드
void channelDown() {--channel;} // TV의 채널을 낮추는 기능을 하는 메서드
}
public class TvTest3 {
public static void main(String[] args) {
Tv t1 = new Tv(); // Tv t1; t1 = new Tv();를 한 문장으로 가능
Tv t2 = new Tv();
System.out.println("t1의 channel값은" + t1.channel + "입니다.");
System.out.println("t2의 channel값은" + t2.channel + "입니다.");
t2 = t1; // t1이 저장하고 있는 값(주소)을 t2에 저장한다.
t1.channel = 7; // channel 값을 7으로 한다.
System.out.println("t1의 channel값을 7로 변경하였습니다.");
System.out.println("t1의 channel값은" + t1.channel + "입니다.");
System.out.println("t2의 channel값은" + t2.channel + "입니다.");
}
}
참조변수에는 하나의 값(주소)만이 저장될 수 있으므로 둘 이상의 참조변수가 하나의 인스턴스를 가리키는(참조하는) 것은 가능하지만 하나의 참조변수로 여러 개의 인스턴스를 가리키는 것은 가능하지 않다.
package ch6;
public class TvTest4 {
public static void main(String[] args) {
Tv[] tvArr = new Tv[3]; // 길이가 3인 Tv객체 배열
// Tv객체를 생성해서 Tv객체 배열의 각 요소에 저장
for(int i=0; i<tvArr.length;i++) {
tvArr[i] = new Tv();
tvArr[i].channel = i+10; // tvArr[i]의 channel에 i+10을 저장
}
for(int i=0; i<tvArr.length;i++) {
tvArr[i].channelUp(); // tvArr[i]의 메서드를 호출. 채널이 1증가
System.out.printf("tvArr[%d].channel=%d%n",i, tvArr[i].channel);
}
}//main의 끝
}
class Tv{
// Tv의 속성(멤버변수)
String color; //색상
boolean power; //전원상태(on/off)
int channel; //채널
// Tv의 기능(메서드)
void power() {power = !power;} // TV를 켜거나 끄는 기능을 하는 메서드
void channelUp() { ++channel;} // TV의 채널을 높이는 기능을 하는 메서드
void channelDown() {--channel;} // TV의 채널을 낮추는 기능을 하는 메서드
}
- 변수 하나의 데이터를 저장할 수 있는 공간
- 배열 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
- 구조체 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
- 클래스 데이터와 함수의 결합(구조체 + 함수)
- 함수는 주로 데이터를 가지고 작업을 하기 때문에 많은 경우에 있어서 데이터와 함수는 관계가 깊다. 그래서 자바와 같은 객체지향언어에서는 변수(데이터)와 함수를 하나의 클래스에 정의하여 서로 관계가 깊은 변수와 함수들을 함께 다룰 수 있게 했다.
- 클래스 - 사용자정의 타입(user-defined type)
- 프로그래밍언어에서 제공하는 자료형(primitive type)외에 프로그래머가 서로 관련된 변수들을 묶어서 하나의 타입으로 새로 추가하는 것을 사용자정의 타입(user-defined type)이라고 한다.
- 자바와 같은 객체지향언어에서는 클래스가 곧 사용자 정의 타입이다.
| int hour1, hour2, hour3;
int minute1, minute2, minute3;
int second1, second2, second3; |
| --- |
| int[] hour = new int[3];
int[] minute = new int[3];
float[]second = new float[3]; |
| class Time{
int hour;
int minute;
float second;
} |
시, 분, 초를 하나로 묶는 사용자정의 타입, 즉 클래스를 정의하여 사용해야 한다.