클래스 / 객체 / 인스턴스 정리
클래스, 객체, 인스턴스의 개념
> 클래스(Class) 란
개념
> 객체를 만들어 내기 위한 설계도 혹은 틀
> 연관되어 있는 변수와 메서드의 집합
> 객체(Object) 란
개념
> 소프트웨어 세계에 구현할 대상
> 클래스에 선언된 모양 그대로 생성된 실체
특징
> ‘클래스의 인스턴스(instance)’ 라고도 부른다.
> 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖는다.
> oop의 관점에서 클래스의 타입으로 선언되었을 때 ‘객체’라고 부른다.
구성요소
속성(property) - 멤버변수(member variable), 특성(attribute), 필드(field), 상태(state)
기능(function) - 메서드(method), 함수(function), 행위(behavior)
객체지향 프로그래밍에서는 속성을 멤버변수로, 기능을 메서드로 표현한다.
클래스는 객체를 생성하는데 사용
클래스 (제품 설계도) <-> 객체(제품)
> 인스턴스(Instance) 란
개념
> 설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체 즉, 객체를 소프트웨어에 실체화 하면 그것을 ‘인스턴스’라고 부른다.
> 실체화된 인스턴스는 메모리에 할당된다.
특징
> 인스턴스는 객체에 포함된다고 볼 수 있다.
> oop의 관점에서 객체가 메모리에 할당되어 실제 사용될 때 ‘인스턴스’라고 부른다.
> 추상적인 개념(또는 명세)과 구체적인 객체 사이의 관계 에 초점을 맞출 경우에 사용한다.
> ‘~의 인스턴스’ 의 형태로 사용된다.
> 객체는 클래스의 인스턴스다.
> 객체 간의 링크는 클래스 간의 연관 관계의 인스턴스다.
> 실행 프로세스는 프로그램의 인스턴스다.
즉, 인스턴스라는 용어는 반드시 클래스와 객체 사이의 관계로 한정지어서 사용할 필요는 없다.
인스턴스는 어떤 원본(추상적인 개념)으로부터 ‘생성된 복제본’을 의미한다.
예시
/* 클래스 */
public class Animal {
...
}
/* 객체와 인스턴스 */
public class Main {
public static void main(String[] args) {
Animal cat, dog; // '객체'
// 인스턴스화
cat = new Animal(); // cat은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
dog = new Animal(); // dog은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
}
}
클래스, 객체, 인스턴스의 차이
클래스(Class) VS 객체(Object)
> 클래스는 ‘설계도’, 객체는 ‘설계도로 구현한 모든 대상’을 의미한다.
객체(Object) VS 인스턴스(Instance)
> 클래스의 타입으로 선언되었을 때 객체라고 부르고, 그 객체가 메모리에 할당되어 실제 사용될 때 인스턴스라고 부른다.
> 객체는 현실 세계에 가깝고, 인스턴스는 소프트웨어 세계에 가깝다.
> 객체는 ‘실체’, 인스턴스는 ‘관계’에 초점을 맞춘다.
> 객체를 ‘클래스의 인스턴스’라고도 부른다.
> ‘방금 인스턴스화하여 레퍼런스를 할당한’ 객체를 인스턴스라고 말하지만, 이는 원본(추상적인 개념)으로부터 생성되었다는 것에 의미를 부여하는 것일 뿐 엄격하게 객체와 인스턴스를 나누긴 어렵다.
인스턴스 생성과 사용
Tv tv; // (1)
tv = new Tv(); // (2)
(1) Tv 클래스의 참조변수 t 선언, 인스턴스는 생성되지 않음
(2) Tv 클래스의 인스턴스가 메모리의 빈 공간에 생성된다. 대입연산자(=) 에 의해 생성된 인스턴스의 주소값이 참조변수 tv에 저장된다.
인스턴스는 참조변수를 통해서만 다룰 수 있으며 참조변수의 타입은 인스턴스의 타입과 일치해야 한다.
Tv tv1 = new Tv(); // (1)
Tv tv2 = new Tv(); // (2)
tv2 = tv1; // (3)
(3) tv1이 저장하고 있던 인스턴스 주소를 tv2에 저장한다. 그렇게 되면 tv2는 tv1이 참조하고 있던 인스턴스를 같이 참조하게 되고, tv2가 원래 참조하고 있던 인스턴스는 더 이상 사용할 수 없게 된다.
이 때 자신을 참조하고 있는 참조변수가 하나도 없는 인스턴스는 더 이상 사용될 수 없으므로 Garbage Collector에 의해 메모리에서 제거된다.
참조변수에는 하나의 주소만이 저장될 수 있으므로 둘 이상의 참조변수가 하나의 인스턴스를 참조하는 것은 가능하지만 하나의 참조변수로 여러 개 인스턴스를 참조할 수 없다.
객체 배열
참조변수들을 하나로 묶은 참조 변수 배열
Tv[] tvArr = new Tv[2]; // (1)
tvArr[0] = new Tv(); // (2)
tvArr[1] = new Tv(); // (3)
(1) 길이가 2인 Tv 타입의 참조변수 배열 생성, 참조변수들이 만들어진 것 뿐이고 아직 객체가 저장되지 않아
(2), (3) 처럼 객체를 생성해서배열의 각 요소에 저장해야 한다.
클래스 - 사용자정의 타입
객체지향언어에서는 클래스가 곧 사용자 정의 타입(user-defined type)이다.
객체지향언어에스는 제어자와 메서드를 이요해서 추가적인 제약건들을 코드에 쉽게 반영할 수 있다.
public class Person {
private String name;
private int age;
private double weight;
public int getAge(){
return age;
}
public double getWeight(){
return weight;
}
public void setAge(int age){
if(age<1 || age >150) return;
this.age = age;
}
public void setWeight(double weight){
if(weight<0) return;
this.weight = weight;
}
}
제어자를 이용해서 변수의 값을 직접 변경하지 못하도록 하고 메서드를 통해서 유효성 검사를 하고 값을 변경하도록 작성할 수 있다.