ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Head First Java] Chapter 2 - 객체 마을로의 여행
    Dev 2021. 1. 20. 17:20

    * 해당 포스트는 "Head First Java" 책을 읽고 난 이후의 정리 내용입니다.

      자세한 내용은 "Head First Java" 책을 통해 확인해주세요.

     

    객체(Object)에 대해 다루는 챕터

    절차적으로 실행했을 때 조건으로 행동을 분기해서 사용하는 방식에서 벗어나

    더보기

    절차적 관점에서의 행동 매핑

    public static void rotate(String shapeType){
        switch(shapeType){
          case "AMOEBA":
            System.out.println("아메바 회전!");
            // HIF 소리 출력
            break;
          case "CIRCLE":
            System.out.println("원형 회전!");
            // AIF 소리 출력
            break;
          case "SQUARE":
            System.out.println("사각형 회전!");
            // AIF 소리 출력
            break;
          case "TRIANGLE":
            System.out.println("삼각형 회전!");
            // AIF 소리 출력
            break;
          default:
            System.err.println("도형이 뭔가 이상한데용?");
        }
      }

     

    Object를 활용해 행동을 자동으로 매핑하도록 사용하는 방법이라고 생각하면 될 것 같다.

     

    더보기

    클래스 구조를 상위-하위의 상속 구조를 사용해 구성한 후 오브젝트를 생성해 사용

    class Shape {
      public void rotate(){
        logging();
      }
      public void playSound(){
        logging();
      }
      private void logging(){
        Date dt = new Date();
        System.out.print(dt + ": ");
      }  
    }
    
    class Circle extends Shape{
      @Override
      public void rotate() {
        System.out.println("원형 회전!");
      }
    
      @Override
      public void playSound() {
        System.out.println("원형 AIF 실행");
      }
    }
    
    public class Main{
      public static void main(String[] args){
        Shape a = new Square();
        a.playSound();
      }
    }

     

    위의 코드의 예처럼 하나의 화면에서 여러 종류의 도형이 존재하고, 각 도형을 클릭할 때의 이벤트를 발생시키려면 절차적 관점에서는 하나의 이벤트가 발생할 때 마다 그 이벤트에 대해 조건에 맞춰 특정 행동을 지정해줘야 한다.

    결국 이는 유지보수에서의 장벽이 된다(하나만 고쳤을 뿐인데 사이드 이펙트를 여러 군데에서 고려해야 함)

     

    오브젝트적 관점에서는 종류를 통해 분류를 하고(도형-사각형),

    상위 클래스(혹은 인터페이스)에 추상화된 인스턴스 변수, 메소드를 정의해놓고

    하위 클래스에서는 이를 extends(class), implements(interface)해 사용한다.

    이를 통해 추상화된 대분류와, 구체화된 소분류로 나타내는 것이다.

     

    Class vs Object

    간단하게 얘기하면

    Class: 청사진 OR 틀(실제 행동하는 친구가 아님),

    Object: 실제 행동하는 친구(인스턴스라고도 불림)

    라고 생각하면 될 것 같다.

     

    Main에서 벗어나는 방법

    main()은 Java 애플리케이션이 시작될 때 가장 먼저 접근하게 되는 진입점이다.

    main()에 모든 로직을 담게 되면 하나의 method에 작성된 코드의 양이 방대해진다.

    하나의 method에 코드의 양이 많아질 수록 구조는 점점 비효율적으로 바뀐다.

    그럼 이제 바꿔보자.

    더보기
    class Player {
      int number = 0;
      public void guess(){
        number = (int) (Math.random() * 10);
        System.out.println("I'm guessing " + number);
      }
    }
    
    class GuessGame {
    
      Player p1;
      Player p2;
      Player p3;
       
      public void startGame(){
        // 실제 게임이 구동되는 로직
      }
    }
    
    public class GameLauncher {
      public static void main (String[] args) {
        GuessGame game = new GuessGame();
        game.startGame();
      }
    }
    
    

     

     

    ⏩추가

    더보기

    기본적으로 Java나 다른 OOP 관점에서의 언어들은 SRP라 하는 단일 책임 원칙을 가지고 있어야 한다.

    다음 링크는 SOLID에 대해 정리해주신 포스트이다.

     

    velog.io/@kyle/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-SOLID-%EC%9B%90%EC%B9%99-%EC%9D%B4%EB%9E%80

     

    객체지향 SOLID 원칙 이란?

    객체지향에서 SOLID 원칙이란 무엇인가?

    velog.io

     

    ⏩추가2

    자바 프로그램? 애플리케이션? - 여러 클래스들이 하나의 main 진입점을 가지고 작성된 하나의 프로그램

    묶을 때에는 jar 등을 통해 묶어 사용할 수 있다.

    'Dev' 카테고리의 다른 글

    [Head First Java] Chapter 4 - 객체의 행동  (0) 2021.01.24
    Zulu Java 8 설치  (0) 2020.06.05

    댓글

Designed by Tistory.