본문 바로가기

하루정리

2022.08.02 개념 공부 클래스, 객체, 인스턴스란? 그리고OOP

'클래스' 란?

 

일종의 설계도라고 생각하면 된다.

예를 들면 마우스의 기능 하나를 만드는데 필요한 프로그램적 기능과

사용되는 변수명 등이 적혀있는 전체적인 설계도이다. 

 

'객체(Object)'란

클래스라는 설계도를 통해 실제로 구현하려는 그리고 구현된 대상을 말한다

마우스의 클래스(설계도)를 통해 실제로 만들어진 마우스를 말한다. 

클래스의 인스턴스라고도 부른다. 

객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖는다.

OOP의 관점에서 클래스의 타입으로 선언되었을 때 '객체'라고 부른다. 

 

*OOP란? : 객체지향프로그래밍 (Object Oriented Programming)을 말함. 

(기본중의 기본이니 외워둘 것) 

OOP의 상세 내용은 아래쪽에 다시 정리함. 

'인스턴스(Instance)'란

클래스라는 설계도를 통해 소프트웨어 세계에 '구현된 구체적인 실체'

즉 객체를 소프트웨어에 실체화 하면 그것을 인스턴스라고 부른다\

실체화 된 인스턴스는 메모리에 할당된다

인스턴스는 객체에 포함된다고 볼 수 있음. 

OOP의 관점에서 객체가 메모리에 할당되어 실제 사용될 때 '인스턴스'라고 부른다.

추상적인 개념(또는 명세)과 구체적인 객체 사이의 초점을 맞출 경우 사용.

 

객체는 클래스의 인스턴스

실행 프로세스는 프로그램의 인스턴스

 

즉, 인스턴스라는 용어는 반드시 클래스와 객체 사이의 관계로

한정지어서 사용할 필요는 없다.

 

예시

클래스

public class animal{

 

객체와 인스턴스

public class main{

public static void main (String[] args){

animal cat, dog;  = 객체

 

인스턴스화

cat = new animal();

dog = new animal();

}}}

 

나는 리스트 선언과 비슷하다고 느꼈다. 

List <String> arr = new List<>();

는 이미 존재하는 List라는 클래스(설계도)를 arr이라는 이름으로 선언해서 사용하는 것이기에

이것은 리스트의 인스턴스라고 볼 수 있다. 

 

프로젝트를 할 때 가장 많이 사용했던 게 List인데

역시 코딩은 많이 해봐야 이렇게 이해를 할 수 있었다. 

 

정리 클래스(Class) VS 객체(Object)

클래스는 설계도, 객체는 설계도로 구현한 모습

 

정리  객체(Object) VS 인스턴스(Instance)

클래스 타입으로 선언되었을 때 객체라고 부르고,

그 객체가 메모리에 할당되어 실제 사용될 때 인스턴스라고 부름

 

객체는 현실 세계에 가깝고 인스턴스는 소프트웨어 세계에 가깝다

 

객체는 '실체' 인스턴스는 '관계'에 초점을 맞춘다. 

객체를 클래스의 인스턴스라고도 부른다. 

 

 

 

나는 클래스 객체와 인스턴스의 구분이 힘들었다. 

클래스 VS 객체, 인스턴스 의 차이는 알았지만 

 

비슷한 개념이던 객체와 인스턴스는 이해가 되지 않았는데

구글과 혼공자를 뒤지며 공부한 결과

완벽하지는 않아도 어느정도는 알게 된 듯 싶다. 

 

 

추가 정리 OOP(Object Oriented Programming)

객체지향프로그래밍의 4가지 속성

 

캡슐화, 추상화, 다형성, 상속성

 

 

'캡슐화' 란?

하나의 객체에 대해 그 객체가 특정한 목적을 위해 필요한 변수나 메소드를 하나로 묶는 것을 말한다.

 

따라서 클래스를 우리가 만들 때 훗날 이클립스에서 만들어진 객체가

특정한 목적을 가지고 사용해야 할 변수와 그 변수를 가지고

특정한 액션 즉 메서드 또는 함수를 관련성있게 구성해야 한다. 

 

캡슐화의 중요 목적중 하나는 정보의 은닉화이다.

만약 변수가 publick으로 선언되면

누군가 접근하여 이를 재선언 할 수 있다. 

즉 이렇게 할 수 없도록 private로 선언한다.

그리고 getter setter로 간접적으로만

접근이 가능하도록 하는 것. 

 

이것이 바로 캡슐화의 중요한 목적이다.

 

내가 이해한 것 DTO

 

 

'추상화' 란?

예를 들어 차를 만든다고 하자

수백대의 차를 만드는데 각각의 바퀴, 휠을 모두 

설계도를 만들고 변수, 메소드를 전부 만들어주는 건 

말도 안되는 것이다. 

 

그렇다면 방법은

차를 만드는데 있어 공통적으로 들어가는

부분의 특징을 한대 모아 하나의 설계도로

만들어서 사용하는 것이다. 

이 공통적인 메소드, 객체가 있는 클래스가 바로 추상 클래스이다.

 

 

 

'다형성' 이란?

상속을 통해 기능을 확장하거나 변경하는 것을 말한다. 

이를 통해 코드의 재사용, 코드길이 감소 및 최적화를 통해

유지보수가 용이하도록 해준다. 

 

내가 사용했던 방법은 

리스트를 불러오는 방식이었는데

매개변수의 안에 담긴 값에 따라

다른 리스트를 불러올 수 있도록 했다. 

특정 상품만 불러오기 같은 것. 

 

크게 보면 오버라이딩(Overridng)과 오버로딩(Overloading)이다. 

 

오버라이딩은 부모클래스에서 상속받은 서브클래스 즉 자식클래스에서

부모클래스, 즉 상위클래스에서 만들어진 메서드를 자신의 입맛대로 다시 재창조해서 

사용하는 것을 말한다. 

 

오버로딩은 하나의 클래스 안에서 같은이름의 메서드를 사용하지만 각 메서드마다 

다른 용도로 사용되며 그 결과물도 다르게 구현할 수 있게 만드는 개념이다. 

 

오버로딩이 가능하려면 메서드끼리 이름은 같지만 매개변수의 갯수., 데이터타입이 달라야

오버로딩이 적용되어 메서드 이름이 같아도 문법 에러가 나지 않는다. 

 

 

'상속성,재사용' 이란?

객체지향의 꽃이라 할 수 있다. 

 

기존 상위클래스에 근거, 새롭게 클래스와 행위를 정의할 수 있도록 해주는 개념

 

기존클래스의 기능을 가져와 재사용할 수 있으면서도 

동시에 새롭게 만든 클래스에 새로운 기능을 추가할 수 있도록 만들어줌. 

 

참고로 자바는 단일상속밖에 안 되며 c++에서 다중상속이 지원됨.