자바의 정석 3rd Edition 기반으로 공부한 글 입니다.
클래스 -------------> 인스턴스(객체)
= 멤버변수 (member variable)
= 특성 (attribute)
= 필드 (field)
= 상태 (state)
= 메서드 (method)
= 함수 (function)
= 행위 (behavior)
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 Main {
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 + " 입니다.");
}
}
Tv t;
Tv클래스 타입의 참조변수 t를 선언한다.
메모리에 참조변수 t를 위한 공간이 마련된다.
아직 인스턴스가 생성되지 않았으므로 참조변수로 아무것도 할 수 없다.
t = new Tv();
연산자 new에 의해 Tv클래스의 인스턴스가 메모리의 빈 공간에 생성된다. (주소 할당)
이 때, 멤버변수는 각 자료형에 해당하는 기본값으로 초기화 된다.
t.channel = 7;
참조변수 t에 저장된 주소에 있는 인스턴스의 멤버변수 channel에 7을 저장한다.
t.channelDown();
참조변수 t가 참조하고 있는 Tv인스턴스의 channelDown메서드를 호출한다.
channelDown()에 의해서 channel의 값은 7에서 6이 된다.
인스턴스는 참조변수를 통해서만 다룰 수 있으며,
참조변수의 타입은 인스턴스의 타입과 일치해야한다.
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 Main {
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;
System.out.println("t1의 channel값을 7로 변경하였습니다.");
System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
}
}
같은 클래스로부터 생성되었을지라도 각 인스턴스의 속성(멤버변수)은 서로 다른 값을 유지할 수 있으며,
메서드의 내용은 모든 인스턴스에 대해 동일하다.
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 Main {
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.channel = 7;
System.out.println("t1의 channel값을 7로 변경하였습니다.");
System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
}
}
t2 = t1;
t1은 참조변수이므로, 인스턴스의 주소를 저장하고 있다.
이 문장이 수행되면, t2가 가지고 있던 값은 잃어버리게 되고 t1에 저장되어 있던 값이 t2에 저장되게 된다.
t2 역시 t1이 참조하고 있던 인스턴스를 같이 참조하게 되고,
t2가 원래 참조하고 있던 인스턴스는 더 이상 사용할 수 없게 된다.
참조변수에는 하나의 값(주소)만이 저장될 수 있다.
둘 이상의 참조변수가 하나의 인스턴스를 가리키는(참조하는) 것은 가능하지만,
하나의 참조변수로 여러 개의 인스턴스를 가리키는 것은 불가능하다.
많은 수의 객체를 다뤄야할 때, 사용한다.
객체 배열 안에 객체가 저장되는 것이 아닌, 객체의 주소가 저장된다.
사실 객체 배열은 참조변수들을 하나로 묶은 참조 변수 배열이다.
Tv[] tvArr = new Tv[3]; // 길이가 3인 Tv타입의 참조변수 배열
// 객체를 생성해서 배열의 각 요소에 저장
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();
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 Main {
public static void main(String[] args) {
Tv[] tvArr = new Tv[3];
for(int i=0; i < tvArr.length; i++) {
tvArr[i] = new Tv();
tvArr[i].channel = i+10;
}
for(int i=0; i <tvArr.length; i++) {
tvArr[i].channelUp();
System.out.printf("tvArr[%d].channel=%d%n", i, tvArr[i].channel);
}
}
}
프로그래밍언어에서 데이터 처리를 위한 데이터 저장형태의 발전 과정
변수 ---> 배열 ---> 구조체 ---> 클래스
변수 = 하나의 데이터를 저장할 수 있는 공간
배열 = 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
구조체 = 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
클래스 = 데이터와 함수의 결합 (구조체 + 함수)
변수와 함수가 서로 유기적으로 연결되어 작업이 간단하고 명료해진다.
사용자정의 타입 = 프로그래머가 서로 관련된 변수들을 묶어서 하나의 타입으로 새로 추가하는 것
class Time {
int hour;
int minute;
float second;
}
시, 분, 초를 저장하기 위한 세 변수를 멤버변수로 갖는 Time클래스를 정의한 것이다.
보다 정확한 데이터를 유지할 수 있다.