객체지향의 원리와이해1

Jaewoooook·2022년 1월 3일
0

객체 지향 이란?

객체는 사물이다. 즉, 사물은 평소에 돌아다니는 모든 형태이고 객체 지향적 프로그래밍이란, 기계적인 흐름이 아닌 사물과 같은 눈에 보이는 형태로의 프로그래밍을 가능케 하는 형태를 의미한다고 생각한다.

객체 지향의 4대 특성!

캡 상 추 다!!

캡 슐화 : 정보은닉
상 속 : 재사용
추 상화 : 모델링
다 형성 : 사용 편의

추상화 : 모델링

추상의 사전적 의미는 여러 가지 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출하여 파악하는 작용이다.

객체지향의 추상화는 곧 모델링이다.

추상화란 구체적인 것을 분해해서 관찰자가 관심 있는 특성만 가지고 재조합하는 것이라고 정리할 수 있다.

추상화란 아래에 있는 애플리케이션 경계에 있는 특성만 가지고 재조합 하는 것 = 모델링!!

ex)지구본은 지구를 모델링 하고 있다.
지구본은 지구의 굴곡과 바다, 기후를 지구본에 표현할 수도 없고, 필요도 없다.

즉, 모델은 실제 사물을 정확히 복제하는 게 아니라 목적에 맞게 관심 있는 특성만을 추출해서 표현하는 것이다.

모델은 추상화를 통해 실제 사물을 단순하게 묘사하는 것이다. 이런 모델링(추상화)는 객체 지향에서 클래스를 설계할 때 필요한 기법이고 또한 데이터베이스의 테이블을 설계할 때 필요한 기법이다.

클래스와 객체의 관계

클래스 vs 객체

클래스와 객체를 구분하기 위해서는 그것에 대한 속성에 대한 질문을 하면된다.

김연아는 클래스?객체인가?
뽀로로는 클래스?객체인가?
사람은 클래스?객체인가?
펭귄은 클래스?객체인가?

사람, 펭귄은 클래스이고, 김연아, 뽀로로는 객체가된다.
예를 들어 각 위 4개의 예시에 나이는 몇살인가?라는 질문을 하게된다면
사람과 펭귄은 대범주에 속하기 때문에 논리적으로 명확히 나이가 몇살이라고 할 수없다.
하지만, 김연아와 뽀로로의 나이는 검색을하거나 정보를 통해서 나이를 추정할 수 있다.

이러한 것이 객체와 클래스의 차이이다.

클래스는 분류에 대한 개념이지 실체가 아니다. 객체는 실체다!

객체는 객체 보다는 object를 따라 개체에 가깝다.
개체의 사전적 의미
1. 전체나 집단에 상대하여 하나하나의 낱개를 이르는말
2. 생물 하나의 독립된 생물체. 살아가는 데에 필요한 독립적인 기능을 갖고 있다.
3. 철학 단일하고 독립적인 통일적 존재. 철학 사상의 발전 과정에서 이 통일성은 물질적 양적 측면, 또는 정신적 질적 측면 따위의 여러 관점에서 고찰되었다.

약간의 느낌은 비슷하지만 이것보다 직접적인 객체의 의미를 붙여보자면,

객체: 세상에 존재하는 유일무이한 사물
클래스: 분류, 집합, 같은 속성과 기능을 가진 객체를 총칭하는 개념

객체 지향 언어인 자바로 새로운 사람이 태어났다는 것을 클래스와 객체의 형태로 표현한다면?

사람 홍길동 = new 사람();
//이러한 형태가 될 수 있다.
Human 홍길동 = new Human();
//이런 느낌이다.
사람 줄리엣 = new 사람();

사람이라는 클래스(분류)를 이용해 유일무이하고 새로운 하나의 사람(객체)를 만들어 홍길동(객체 참조 변수)이라는 이름을 지어준 것이다.

클래스를 이용해서 object를 만들었다는 것을 강조할 때는 object라는 표현보다는 클래스의 인스턴스(instance)라는 표현을 쓴다.

인간은 객체를 먼저 인식하고 그다음에 클래스를 인식하게 되지만 창조주인 하느님께서는 객체를 만드시기 전에 클래스라는 개념을 먼저 갖고 계셨을 것이다. 아담과 이브라는 객체를 만드시기 전에 클래스로서 사람이라는 개념을 먼저 가지고 계셨을 것이다.

사람을 클래스라고 하는 경우

클래스의 속성

시력, 몸무게, 혈액형, 키, 나이, 직업, 취미 등등 명사로 표현되는 특성을 속성이라고 한다. 속성은 값을 가질 수 있다.

클래스의 메서드

먹다, 자다, 일하다, 침 뱉다, 운전하다, 울다 등등 동사로 표현 되는 특성을 기능/행위라고 한다. 이러한 기능/행위는 수행 절차 또는 로직이라고 하는 것을 갖게 된다. 기능/행위를 객체 지향에서는 메서드라고 한다.

애플리케이션 경계

애플리케이션 컨텍스트라고 부르기도한다.

병원 애플리케이션을 만든다고하면, 사람은 환자라고 부르고 구체적인 특성도 바뀐다.
은행 애플리케이션을 만든다고하면, 사람은 고객이라고 부르고 구체적인 특성도 바뀐다.

이러한것이 애플리케이션 경계이다.

클래스와 객체 & 추상화 정리

중요한 부분 강조!

클래스 설계에서 추상화가 사용된다.
클래스 설계를 위해서는 애플리케이션 경계부터 정해야 한다.
객체 지향에서 추상화의 결과는 클래스다.

사실 추상화의 개념을 넓게 본다면 아래의 내용도 포함된다.

1.상속을 통한 추상화, 구체화
2.인터페이스를 통한 추상화
3.다형성을 통한 추상화

클래스 멤버 vs 객체 멤버 = static 멤버 vs 인스턴스 멤버

public class Mouse {
	public String name;
    public int age;
    public static int countOfTail = 1;
    
    public void sing() {
    	System.out.println(name + "찍찍!!!");
        }
    }
        
public class MouseDriver {
	public static void main(String[] args) {
    	//클래스명.countOfTail
        Mouse.countOfTail = 1;
        
        Mouse mickey = new Mouse();
        Mouse jerry = new Mouse();
        Mouse mightyMouse = new Mouse();
        
        //객체명.countOfTail
        System.out.println(mickey.countOfTail);
        System.out.println(jerry.countOfTail);
        System.out.println(mightyMouse.countOfTail);
        
        System.out.println(Mouse.countOfTail);
        }
      }

이렇게 static 키워드가 붙은 속성을 클래스 멤버 속성이라고 하고, static이 안 붙은 속성은 객체 멤버 속성이라고 한다.

속성뿐만 아니라 메서드도 static 키워드를 붙였느냐 안 붙였느냐에 따라 클래스 멤버 메서드, 객체 멤버 메서드로 분류한다.

클래스 멤버들은 static 키워드와 함께 사용되고 또 메모리에서 static 영역에 상주하게 되므로 static멤버라고 한다. 객체 멤버들은 객체가 클래스의 인스턴스이므로 인스턴스 멤버라고한다.

클래스 멤버 = static 멤버 = 정적 멤버
객체 멤버 = 인스턴스 멤버

static 멤버 (정적 멤버)의 속성은 위와 같이 해당 클래스의 모든 객체들이 같은 값을 가질 때 사용하는 것이 정석이다.

static 메서드 (정적 메서드)

정적 메서드는 객체의 선언 없이도 독자적으로 따로 쓰일 수 있음을 의미한다.
한마디로 전역 변수 전역 메서드와 비슷하게 생각할 수 있다.

또한 static 메서드는

static 메서드 영역에서는 static메서드, static멤버만 호출하고 선언할 수 있다.
이외의 인스턴스 멤버 인스턴스 메서드는 호출하거나 선언할 수 없다.

하지만, 이와 반대로 인스턴스 메서드에서는 static 메서드를 호출하거나, 멤버를 호출할 수 있다.

0개의 댓글