Object (객체) 와 Instance(인스턴스) 는 객체지향 프로그래밍에서 거의 비슷한 개념으로 사용되지만 차이가 있다.
객체지향 프로그래밍적 관점에서 객체는 클래스의 타입으로 선언되었을 때를 의미하고
그 객체가 메모리에 할당되어 실제 사용될 때 인스턴스 라고 할수있다.
클래스(Class) 란
- 개념
- 객체를 만들어 내기 위한 설계도 혹은 틀
- 연관되어 있는 변수와 메서드의 집합
객체(Object) 란
- 개념
- 소프트웨어 세계에 구현할 대상
- 클래스에 선언된 모양 그대로 생성된 실체
- 특징
- '클래스의 인스턴스(instance)’ 라고도 부른다.
- 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖는다.
- oop의 관점에서 클래스의 타입으로 선언되었을 때 ‘객체’라고 부른다.
인스턴스(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 클래스의 '인스턴스'(객체를 메모리에 할당)
}
}
https://gmlwjd9405.github.io/2018/09/17/class-object-instance.html
클래스, 객체, 인스턴스의 차이
# 클래스(Class) VS 객체(Object)
- 클래스는 ‘설계도’, 객체는 ‘설계도로 구현한 모든 대상’을 의미한다.
# 객체(Object) VS 인스턴스(Instance)
- 클래스의 타입으로 선언되었을 때 객체라고 부르고, 그 객체가 메모리에 할당되어 실제 사용될 때 인스턴스라고 부른다.
- 객체는 현실 세계에 가깝고, 인스턴스는 소프트웨어 세계에 가깝다.
- 객체는 ‘실체’, 인스턴스는 ‘관계’에 초점을 맞춘다.
- 객체를 ‘클래스의 인스턴스’라고도 부른다.
- ‘방금 인스턴스화하여 레퍼런스를 할당한’ 객체를 인스턴스라고 말하지만,
이는 원본(추상적인 개념)으로부터 생성되었다는 것에 의미를 부여하는 것일 뿐 엄격하게 객체와 인스턴스를 나누긴 어렵다.
추상화 기법
# 분류(Classification)
- 객체 -> 클래스
- 실재하는 객체들을 공통적인 속성을 공유하는 범부 또는 추상적인 개념으로 묶는 것
# 인스턴스화(Instantiation)
- 클래스 -> 인스턴스
- 분류의 반대 개념. 범주나 개념으로부터 실재하는 객체를 만드는 과정
- 구체적으로 클래스 내의 객체에 대해 특정한 변형을 정의하고, 이름을 붙인 다음, 그것을 물리적인 어떤 장소에 위치시키는 등의 작업을 통해 인스턴스를 만드는 것을 말한다.
- ‘예시(Exemplification)’라고도 부른다.
클래스 메서드와 인스턴스 메서드
# 클래스 메서드
- 메서드 앞에 static 이 붙어 있으면 클래스 메서드
- 클래스 메서드도 클래스 변수처럼 객체를 생성하지 않고 '클래스이름.메서드이름(매개변수)'와 같이 호출가능
- 클래스변수(static 변수)는 인스턴스를 생성하지 않아도 사용할 수 있다.
- 클래스 메서드(static 메서드)는 인스턴스 변수를 사용할 수 없다.
: static이 붙은 메서드는 인스턴스 생성 없이 호출 가능한 반면, 인스턴스 변수는 인스턴스를 생성해야만 만들어지 때문에 static이 붙은 메서드에서 인스턴수 변수의 사용을 허용하지 않음. 그러나, 인스턴스 변수나 인스턴스 메서드에서는 static이 붙은 멤버들을 사용한 것은 언제나 가능.
# 인스턴스 메서드
- 반드시 객체 생성해야만 호출 가능
붕어빵을 만들려면 붕어빵을 찍기 위한 틀이 있어야 한다. 틀이 준비되었다면 틀에 밀가루
반죽과 팥을 집어넣고 구워준다. 적당히 구워지면 틀에서 꺼낸다. 그로서 붕어빵이 탄생!
이 과정을 Class, Object (객체), Instance의 관점에서 살펴보도록 하겠습니다.
우선 일대일 대응을 시켜 보도록 하죠.
o 붕어빵틀 = Class
o 붕어빵 = Object (객체)
o 각각의 붕어빵 = Instance
o 붕어빵을 굽다 = 인스턴스(Instance)화 하다
뭔가 확~ 머릿속을 지나가지 않나요?
그럼 붕어빵이란 Class에 대해 생각해 보도록 하죠!
붕어빵틀은 ‘밀가루 반죽’과 ‘팥’이라는 변수(member variable)를 가지고 있습니다.
그리고 ‘굽다’라는 메서드(member method)를 가지고 있습니다.
이것을 일반적인 class의 표현법으로 나타내 보면..
그럼 이제 붕어빵을 구워 볼까요?
일단 붕어빵틀에 밀가루 반죽과 팥을 집어넣겠습니다. 아! 하나만 만들면 저희가 먹을 수
없으니까 6개를 만들어 보도록 하죠..
각각의 붕어빵에는 저희의 이름을 붙이도록 하겠습니다.
각각의 붕어빵에 서로 밀가루 반죽과 밭의 양을 각각 다르게 집어넣었습니다.
이제 ‘굽다()’라는 메서드를 호출해서 붕어빵을 굽겠습니다..
붕어빵이 구워지고 있습니다~ 군침이 도는군요..^^ 지금 과정이 인스턴스(Instance)화
하고있는겁니다.
캬우~ 붕어빵이 다 구워졌습니다~^^ 드디어 객체들이 만들어 진거죠!!!
붕어빵들을 살펴보면 같은 틀에서 구워졌지만 모양들이 자신만의 개성을 가지고 있죠..
그 각각의 개성을 가진 녀석들을 즉, 실제 붕어빵들을 인스턴스(Instance)라고 부르는 겁니다.
이제 맛있게 붕어빵을 먹으면서 스스로 한번 정리해보세요^^
---------------------------------- FishBreadTool.java ----------------------------------
public class FishBreadTool {
// member variable
private String name; // 붕어빵의 이름
private int flour; // 밀가루반죽의 양
private int redbean; // 팥의 양
// Constructor
public FishBreadTool ( String iname, int iflour, int iredbean ){
name = iname;
flour = iflour;
redbean = iredbean;
bake();
}
// memeber method
public void bake(){
System.out.println(name + " 붕어빵이 만들어 졌습니다.");
}
}
---------------------------- FiahBreadMaker.java --------------------------------------
public class FishBreadMaker {
public static void main(String[] args){
// 붕어빵틀에 밀가루반죽과 팥을 넣고 굽습니다.
FishBreadTool a = new FishBreadTool("덕수붕어",2,3);
FishBreadTool b = new FishBreadTool("준훈붕어",2,2);
FishBreadTool c = new FishBreadTool("풍석붕어",3,3);
FishBreadTool d = new FishBreadTool("진영붕어",2,2);
FishBreadTool e = new FishBreadTool("현진붕어",2,1);
FishBreadTool f = new FishBreadTool("진희붕어",1,1);
}
}
연관된 글 :
참고 :
https://gmlwjd9405.github.io/2018/09/17/class-object-instance.html
https://blog.naver.com/kamuy10/40041402909
'개발 > Java' 카테고리의 다른 글
[Java] BeanUtils (0) | 2019.04.08 |
---|---|
Java - Method (메소드) 개념 (0) | 2018.12.27 |
[Java] 생성자(constructor) 개념 (0) | 2018.12.27 |
[Java] WapperClass (0) | 2018.12.27 |
[Java] @Override (0) | 2018.12.27 |