스프링 입문을 위한 자바 객체지향의 원리와 이해를 읽고 <회고록>

zio도미닉·2021년 11월 18일
1

목차

  1. 무엇을 배웠는가?!

    • 객체지향의 4대 특성
    • 상속과 인터페이스
    • 멀티스레드와 멀티 프로세스
  2. 느낀점

  3. 그래서 추천할만한 가치가 있어?!

그래서 무엇을 배웠는데?!

질문!!!

  1. 자신은 객체지향의 4대 특징이 뭔지 안다.
  2. 상속과 인터페이스를 구분할 수 있다.
  3. 멀티스레드와 멀티 프로세스의 차이점을 알고 있다.

다 알고 있다 -> 15분 동안 끄고 다른거 하셔도 됩니다 😜

1. 객체지향의 4대 특징?!

  • 대부분은? 캡슐화가 있었고 상속이 있었고 음.. 그리고 추상화였나?! 그 다음이 뭐였지?! 이런식으로 대답

  • 그럼 어떻게 해야 쉽게 외울수 있을까?! -> 캡 상 추 다

캡슐화는?

  • 캡슐화는 클래스 안에 data와 Method를 하나로 묶고 (알약 캡슐처럼) 묶어진 정보를 접근 제어자 (public, protected, default, private)을 통해 은닉하는 것

상속화는?

  • 보통 상속이라고 하면...?! 부모가 자식에게 물려주고 또 그 자식은 재산을 물려주고... 이건 객체 지향에서 말하는 상속이 아님
    • 계층도 (X)
    • 그럼 왜 계층도는 객체지향에서 말하는 상속이 아닌데?!
    • 상속 관계에서 반드시 만족해야 할 문장이 있음
      • 하위 클래스는 상위 클래스이다.
    • 아빠는 할아버지다?
    • 아들은 아빠다?
      이상하고 괴상함...
      코드로 표현해보자
    아빠 춘향 = new();
    // 딸이 아빠 역할을 할 수 있을까?!... 괴이함...  
  • 그럼 자바에서 말하는 상속은 뭔데?
    - 객체 지향에서 상속은 계층도가 아닌 분류도임
    - 즉 객체 지향에서 상속은 재사용 + 확장을 의미함
    - 분류도로 봐보자
  • 포유류는 동물이다.
    • 고래는 포유류다.
    • 고래는 동물이다. -> 전부 말이 됨. 코드로 표현해보자
동물 고래 = new 포유류 ();

원거리딜러 베인 = new 빛의베인();  // 빛의 베인은 원거리 딜러 역할을 한다. 
동물 뽀로로 = new 펭귄(); // 펭귄을 낳으니 동물 역할을 하는 뽀로로라 이름 지었다. 

즉 다시 말해서, 자바에서 상속이란 하위 클래스는 상위 클래스이다.
즉 자바 언어에서 상속(inheritance)라는 키워드는 존재하지 않음 대신 extends(확장)이 존재함. (제임스 고슬링이 정의)

추상화는?

  • 추상화하면 떠오르는 사람은...?! 피카소
  • 근데 면접에서 피카소라고 하면.. 안됨...

  • 피카소의 그림은 각 부분의 특징을 가장 잘 표현할 수 있도록 신체를 분해/ 결합해서 벽화를 그림.

  • 추상화 : 여러 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출하여 파악하는 작용

  • 객체 지향에선...?? 추상화는 모델링이다.

  • 모델링은? 실제 사물을 복제하는 것이 아니라 목적에 맞게 관심 있는 특성만을 추출해서 표현하는 것
    - ex) 지구본? - 지구를 모델링하고 있음
    과학 박물관에 태양계

  • 그럼 모델링이 객체지향에서 중요할까?!

  • 정답은 매우 매우 중요함!

  • 객체 지향에서 모델링은 클래스를 설계하거나 DB 테이블을 설계할때 반드시 필요한 기법

  • 클래스 vs 인스턴스???

  • 클래스와 인스턴스는 붕어빵과 붕어빵 틀이 아님...
    ex) 붕어빵틀을 생산 - 금형기계 -> 클래스
    금형기계 붕어빵틀 = new 금형기계();
    그러면 금형기계에서 만든 붕어빵틀은 객체인가?!NO

  • 붕어빵 틀과 붕어빵은 -> 팩토리 관계

  • 클래스 : 개념(분류), 객체 : 실체
    - ex)

  • 좀 더 자세히 설명해주세요..

  • 클래스 : 같은 특성을 지닌 여러 객체를 총칭하는 집합의 개념

  • 객체 : 클래스에 의해 생성된 유일무이한 것

사람 홍길동= new 사람();
  • 그러면 개발자는 클래스부터 설계?! 인스턴스부터 설계?
  • 정답은 클래스부터 설계하되, 클래스에 들어갈 것을 봐야 한다. 어떻게? 인스턴스들의 공통 사항을 뽑아내서
  • 내가 만들고자 하는 애플리케이션은 어디에서 사용될것인가?! 마다 클래스에 들어갈 항목이 달라짐

다형성 : 사용편의성 (오버라이딩, 오버로딩)

  • [질문] 오버라이딩과 오버로딩의 차이점에 대해 말씀해주세요
  • 앗 너무 쉬운 질문이네, 오버라이딩이 여러개였나... 오버로딩이 여러개 였나.. 재상속 받아서 흠...?!
  • 오버 라이딩 : 같은 메소드 이름, 같은 인자 목록, 상위 클래스의 메서드를 재정의
  • 오버 로딩 : 같은 메소드 이름, 다른 인자 목록으로 다수의 메소드를 중복 정의
  • 이런건.. 구글링하면 나온다고요...
  • 인공위성에서 바라볼때 오토바이에 1명이 riding(타고) 있다.
  • 인공위성에서 바라볼때 트럭에 여러개의 물건이 load(적재) 되어있다.
  • 추가로 전.. 스타크래프트 오버로드는 많이 뽑을수 있으니깐 오버로드 (중복)이 가능하다 이렇게 외웠었습니다...
public class Team {

    public String name;

    public void showMe() {
        System.out.printf("안녕 난 %s야",name);
    }

}


package book.chapter03.java8FunctionInterface;

public class Victory extends Team {

    public String name;

    // 오버라이딩 - 재정의 (같은 메소드르 이름, 같은 인자)
    public void showMe() {
        System.out.printf("안녕 난 빅토리 팀에 %s이야\n",name);
    }

    // 오버로딩 - 중복정의 (같은 메소드 이름, 다른 인자 리스트)
    public void showMe(String mentor) {
        System.out.printf("안녕 우리팀 멘토는 %s 야 \n",mentor);
    }

    // 오버로딩 - 중복정의 (같은 메소드 이름, 다른 인자 리스트)
    public void showMe(String mentor, String mentee) {
        System.out.printf("안녕 우리팀 멘토는 %s고 난 %s야 \n",mentor,mentee);
    }
    
}


package book.chapter03.java8FunctionInterface;

public class Driver {

    public static void main(String[] args) {

        Team team=new Team();
        team.name="DS";
        team.showMe();

        Victory victory=new Victory();
        victory.name="동성";
        // 오버라이딩
        victory.showMe();
        // 오버로딩
        victory.showMe("victory");
        victory.showMe("victory","ANY");


    }
}

2. 상속과 인터페이스?!

  • 차이점에 대해 말씀해보세요

  • 상속은 extends를 쓰고.. 인터페이스는 implements를 씁니다... 이러면 탈락

  • 상속이란? 앞에서 상속이란 계층도가 아닌 분류도 즉,
    - 하위 클래스 is a kind of 상위 클래스

    • 예제 ) 고래는 동물의 한 분류이다.
  • 인터페이스는?
    - 구현 클래스 is able to 인터페이스
    - 구현 클래스는 인터페이스 할 수 있다. 즉, 인터페이스는 기능과 관련된 부분임

    • 예제 ) 고래는 헤엄칠수 있다.
  • 정리

  • 코드
package book.chapter03.java8FunctionInterface;

public class 동물 {
    String myClass;

    동물() {
        myClass="동물";
    }

    void showMe() {
        System.out.println(myClass);
    }

}


interface 날수있는 {
    void fly();
}

interface 잠잘수있는 {
    void sleep();
}


class 포유류 extends 동물 {
    포유류() {
        myClass="포유류";
    }
}

class 박쥐 extends 포유류 implements 날수있는, 잠잘수있는 {

    박쥐() {
        myClass="박쥐";
    }

    @Override
    public void fly() {
        System.out.println(myClass+"는 하늘을 난다 ");
    }

    @Override
    public void sleep() {
        System.out.println(myClass+"는 동굴속에서 잠을 잔다.");
    }
}


class Main {
    public static void main(String[] args) {
        박쥐 m1=new 박쥐();
        m1.fly();
        m1.sleep();
    }
}

  • 질문? 자바는 다중 상속을 지원하는가? 다중 인터페이스를 지원하는가?!
    - 정답은 자바는 다중 상속을 지원 안함, 다중 인터페이스를 지원
    - 인어공주를 예를 들어보자
    -
    - 인어에게 수영해봐 라고 시키면?
    - 사람처럼 수영?, 물고기처럼 지느러미로 수영??
    - 이런걸 다중 상속의 다이아몬드 문제라고 함
    - 또한, 사람, 물고기에 동일한 동일한 메소드명을 가지면?!!
    오버라이딩으로 뭘 써야 할까??? 컴파일부터 에러 난다! 따라서 다중 상속은 지원 안하고 다중 인터페이스를 도입

3. 멀티 쓰레드와 멀티 프로세스..?!

  • 음 멀티 쓰레드를 설명하기 전에 쓰레드는 실행단위이고... 프로그램의 하나의 실로 ... OOO의 정석에서... 전 이렇게 외웠습니다... 근데 기억이 안나...

  • 멀티 쓰레드와 멀티 프로세스를 얘기하기전에 T 메모리 구조부터 얘기하자

  • T 메모리 구조 : T 자형으로 생긴 메모리 구조로, 스태틱 / 스택 / 힙영역으로 구분

    • [질문] 변수들은 메모리에 어디에 있는 것일까?

      • 정답은 스태틱 영역, 스택 영역, 힙 영역 3 곳 모두에 들어갈 수 있음.
      • 스태틱 영역 변수 -> 클래스 멤버 변수 (JVM이 종료될때 까지 고정된 static 상태)
      • 스택 영역 변수 -> 지역 변수 (스택 프레임 안에서 보내다가 스택 프레임이 사라지면 사라짐)
      • 힙 영역 변수 -> 객체 멤버 변수 (힙에서 일생을 보내고, 가비지 컬렉터에 의해 사라짐)
  • 그럼 이게 멀티 스레드/ 멀티 프로세스와 무슨 관계가 있는데?!

  • 멀티 스레드 / 멀티 프로세스의 이해

    • 멀티 스레드는 T 메모리 모델의 스택 영역을 쓰레드 개수만큼 분할해서 쓰는 것

      • 스택영역이 분할되므로 스레드 간의 스택영역을 침범 할 수는 없지만

        큰 측면에서 봤을 때 결국 자바 메모리의 스태틱영역과 힙영역은 공유

      • 멀티 프로세스 대비 메모리를 적게 사용할수 있는 구조

      • 이런 장점때문에 서블릿은 멀티 스레드로 구현되어 있음.

    • 멀티 프로세스
      - 두개 이상 다수의 프로세서(CPU)가 협력적으로 하나 이상의 작업(Task)을 동시에 처리하는 것이다. (병렬처리)
      - 다수의 데이터 저장 영역, 즉 다수의 T 메모리를 갖는 구조
      - 멀티 프로세스는 하나의 프로세스가 다른 프로세스의 T 메모리 영역을 절대 침범할 수 없는 메모리 안전한 구조이지만 메모리 사용량은 그만큼 크다.

이 책을 읽으면서 느낀점은 ?!

  • 그 동안 내가 너무 겉핥기식으로 알았구나...
  • 코드를 예를 들어서 설명할수 있어?! 할때 "전 못한다.였습니다." 지금은 어느정도는 얘기할 수 있구나 라고 생각됩니다. 🤦‍♂️
  • 결론은 기본기 + 자바 한번 더 정리할 수 있었다!

그래서 추천할꺼야?

추천!

  • 자바의 기본기는 아는데 음.. 추천
  • 난 클래스하고 인스턴스가 아직도 붕어빵하고 붕어빵 틀밖에 모르겠어 이러면 추천
  • 즉 자바의 동작원리나 이런걸 한번더 정리하고 싶다 이러면 추천

비 추천!

  • 그걸 모르고 면접 보는게 말이 돼? 이러면 비추천
  • 난 기본기가 되어있어서 별 필요 없어서 스프링을 해야돼 이러면 토비의 스프링 책 추천

마지막으로 회고록...

  • 이상으로 발표를 마치겠습니다!
profile
BackEnd Developer

1개의 댓글

comment-user-thumbnail
2021년 11월 19일

나중에 멀티프로세스와 멀티스레드에 대해 설명 듣고 싶네요... 멋진 포스터구만유~

답글 달기