클래스와 객체?
클래스 | 객체 |
제품 설계도 | 제품 |
TV 설계도 | TV |
붕어빵 기계 | 붕어빵 |
'객체를 정의해놓은 것' 또는 '객체의 설계도 또는 틀'이라고 정의할 수 있다.
클래스는 객체를 생성하는데 사용되며, 객체는 클래스에 정의된 대로 생성된다.
클래스의 정의 : 클래스란 객체를 정의해 놓은 것이다.
클래스의 용도 : 클래스는 객체를 생성하는데 사용된다.
객체의 사전적 정의는 우리가 주변에서 볼 수 있는 책상, 의자, 자동차와 같은 사물들이
곧 객체이다. 프로그래밍에서는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻한다.
객체의 정의 : 실제로 존재하는 것, 사물 또는 개념
객체의 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름
유형의 객체 : 책상, 의자, 자동차, TV와 같은 사물
무형의 객체 : 수학공식, 프로그램 에러와 같은 논리나 개념
객체와 인스턴스
클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화(instaniate)라고 하며,
클래스로부터 만들어진 객체를 그 클래스의 인스턴스(instance)라고 한다.
예를들면 Tv클래스에서 만들어진 객체를 Tv클래스의 인스턴스 라고 한다.
결국 인스턴스와 객체는 같은 의미지만, 객체는 모든 인스턴스를 대표하는
포괄적인 의미이고 인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하는
의미이다.
책상은 인스턴스다(어색) → 책상은 객체다(자연스럽다)
책상은 책상 클래스의 객체이다(어색) → 책상은 책상 클래스의 인스턴스이다.(자연스럽다)
결국 객체와 인스턴스의 의미는 같다, 다만 문맥에 따라 구별하여 사용하는 것이 좋다👍
객체의 구성요소 - 속성과 기능
객체는 속성과 기능, 두 종류의 구성요소로 이루어져 있으며,
일반적으로 객체는 다수의 속성과 다수의 기능을 갖는다.
객체는 속성과 기능의 집합이라고 할 수 있다.
속성(property) : 멤버변수(member variable), 특성(attribute), 필드(field), 상태(state)
기능(function) : 메서드(method), 함수(function), 행위(behavior)
쉽게 이해 하기 위해 스마트폰을 예를 들어보면
스마트폰의 속성은 크기, 길이, 높이, 색상, 볼륨, 통화 같은 것이 있고
기능으로는 켜기, 끄기, 볼륨 높이기, 볼륨 낮추기, 통화 걸기, 통화 끊기 등이 있다.
속성 : 크기, 길이, 높이, 색상, 볼륨, 통화
기능 : 켜기, 끄기, 볼륨 높이기, 볼륨 낮추기, 통화 걸기, 통화 끊기
객체지향 프로그래밍에서는 속성과 기능을 변수와 메서드로 표현한다.
속성(property) → 멤버변수(variable)
기능(function) → 메서드(method)
볼륨 → int volume
볼륨 높이기 → volumeUp(){...}
스마트폰 클래스를 만들면 다음과 같다.
calss SmartPhone {
boolean power; // 전원상태
String color; // 색깔
int volume; // 볼륨
void power() {power != power;}
void volumeUp() {volume++;}
void volumeDown() {volume--;}
}
인스턴스의 생성과 사용
스마트폰 클래스를 선언한 것은 스마트폰 설계도를 작성한 것에 불과하고, 스마트폰 인스턴스를
생성해야 스마트폰을 사용할 수 있다.
클래스명 변수명 // 클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); // 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장
SmartPhone p; // SmartPhone클래스 타입의 참조변수 p를 선언
p = new SmartPhone(); // SmartPhone인스턴스를 생성한 후, 생성된 SmartPhone인스턴스의 주소를 p에 저장
class SmartPhone{
//Tv의 속성(멤버변수)
String color; // 색상
boolean power; // 전원상태(on/off)
int volume; // 볼륨
//Tv의 기능(메서드)
void power() {power = !power; }
void volumeUp() { ++volume; }
void volumeDown() { --volume; }
}
class Source01_PhoneTest1 {
public static void main(String[] args) {
SmartPhone p; // SmartPhone클래스 타입의 참조변수 p를 선언한다
p = new SmartPhone(); // 연산자 new에 의해 SmartPhone클래스의 인스턴스가 생성된다.
p.volume = 7; // 참조변수 p에 저장된 주소에 있는 인스턴스의 멤버변수에 7을 저장한다.
p.volumeUp(); // 참조변수 t가 참조하고 있는 인스턴스의 volumeUp메서드를 호출한다. (++volume;)
System.out.printf("스마트폰 볼륨은 %d 입니다.", p.volume);
}
}
결과 : 스마트폰 볼륨은 8 입니다.
객체 배열
기본형 변수(char, int, ...) 처럼 참조형 변수도 배열을 이용해서 사용이 가능하다
String도 참조형 변수면서 String[]이 가능하듯이 객체도 참조변수들을 하나로 묶어
참조변수 배열로 사용이 가능하다.
SmartPhone p1, p2, p3; // 4개의 SmartPhone클래스를 각각 만듬.
↓변수로 만들기↓
SmartPhone[] pArr = new SmartPhone[3]; //크기가 3인 SmartPhone클래스 배열를 만듬
pArr[0] = new SmartPhone();
pArr[1] = new SmartPhone();
pArr[2] = new SmartPhone();
// 물론 일반 배열과 동일하게 한줄로도 생성가능
SmartPhone[] pArr = {new SmartPhone(), new SmartPhone(), new SmartPhone()};
// 다뤄야할 객체 수가 많을 때 또한 기본형 타입의 배열과 동일하게 반복문 사용 가능
SmartPhone[] pArr = new SmartPhone[100];
for(int i=0 ; i<pArr.length ; i++){
pArr[i] = new SmartPhone();
}
참조변수의 배열..!
객체를 배열로 사용할 일이 없었기 때문에
상상도 못했던 방법인데 또 하나 건지게 됐다. 👍
댓글