ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Head First Java] Chapter 4 - 객체의 행동
    Dev 2021. 1. 24. 02:33

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

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

    * 평어체로 작성되었습니다.

     

    상태는 행동에 영향을, 행동은 상태에 영향을

    지난 챕터들에서 Object에는 각각 인스턴스 변수(상태), 메소드(행동)이 있다는 것을 코드로 확인했다.

    이를 다시 한 번 보자.

     

    해당 클래스들에서 상태/행동을 찾아보자.

    class Item {
    
    // 상태들을 나타냄
      private final long seq;
      private String name;
      private int sellCnt;
    
    // 최초 생성 당시의 상태, 행동을 설정하는 생성자
      public Item(long seq, String name){
        this.seq = seq;
        this.name = name;
        this.sellCnt = 0;
      }
    
    // 여기서부터는 행동들
      public long getSeq() {
        return seq;
      }
    
      public String getName() {
        return name;
      }
    
      public void setName(String name) {
        this.name = name;
      }
    
      public int getSellCnt(){
        return sellCnt;
      }
    
      public void addCnt(){
        sellCnt++;
      }
    }

    Class는 Object에 대한 청사진이다.

    Class를 만든다는 것은 JVM에서 해당 Class Type의 Object를 어떻게 만들 건지 기술하는 것이다.

    고로, 모든 Object는 서로 다른 인스턴스 변수 값을 가질 수 있다.

    위의 클래스에서 Item에 addSellCnt라는 행위가 일어날 때마다, sellCnt의 상태는 변한다.

     

    메소드에 값을 전달해보자

    위의 Item 클래스에서 setName(String name)은 파라메터를 상태(name)에 대입시키는 행동이다.

    public void setName(String name) {
      this.name = name;
    }

    실제 사용할 때에는 Object에서 저 Method를 실행하면서 아규먼트(ball)을 대입하면 된다.

    item.setName("ball");

     

    여러 Argument보내기

    Method에 여러 파라메터를 설정한다면, 그 파라메터에 맞게 Argument를 넘겨주면 된다(아니, 넘겨줘야 한다).

    String addString(String a, String b){
      return a+b;
    }
    
    addString("a", "b"); // 순서대로 들어감

     

    메소드에서 결과 받기

    메소드 명 앞에 작성되어 있는 void, int, String 등의 Type은 메소드에서 결과 값으로 전달할 데이터 타입을 의미한다.

    public String getName() {
      return name;
    }
    
    public void setName(String name) {
      this.name = name;
    }

    getName은 반환 Type이 String, setName은 반환 Type이 void(없음)으로, 반환할 데이터 타입이 존재하는 메소드는 return 뒤에 반환할 값을 넘긴다.

     

    값 전달(Pass By Value)

    Java는 Argument를 넘길 때 값으로 넘긴다. 고로 Parameter의 값을 바꾼다 해도 실제 값은 변경되지 않는다.

    public void testName(String data){
      data = "b";
    }
    
    String tgt = "a";
    testName(tgt);
    System.out.println(tgt); // a

     

    매개변수와 리턴 유형 활용 방법

    Getter와 Setter

    가장 광범위하게 활용되는 Method들이다.

    위의 Item Class를 통해 Getter, Setter를 확인할 수 있다.

      public long getSeq() {
        return seq;
      }
    
      public String getName() {
        return name;
      }
    
      public void setName(String name) {
        this.name = name;
      }

     

    캡슐화

    상태는 외부에서 보이지 않게 숨기고 외부에서는 Method Call만을 통해 상태를 변경시키도록 한다.

    (즉, 직접적으로 상태에 접근할 수 없도록 해야 한다).

    // 상태들을 나타냄
      private final long seq;
      private String name;
      private int sellCnt;
    
    // 최초 생성 당시의 상태, 행동을 설정하는 생성자
      public Item(long seq, String name){
        this.seq = seq;
        this.name = name;
        this.sellCnt = 0;
      }

     

    배열에 있는 객체의 행동 방식

    Dog[] pets = new Dog[7];
    
    pets[0] = new Dog();
    pets[1] = new Dog();
    
    pets[0].setSize(30);
    int x = pets[0].getSize(); // 30
    pets[1].setSize(8);
    

    배열에서 해당 객체를 사용할 때에는

    1) 배열에서 해당 객체를 찾고,

    2) 해당 객체의 행동을 수행한다.

     

    인스턴스 변수 선언과 초기화

    코드에 주석을 달아 설명하겠다.

    class PoorDog { 
      private int size = 30; // 가능
      private String name;
      
      public int getSize() {
        return size;
      }
      
      public String getName(){
        return name;
      }
    }
    
    void test(){
      PoorDog one = new PoorDog();
      System.out.println("Dog size is " + one.getSize()); // 30
      System.out.println("Dog name is " + one.getName()); // null
    }
    
    /*
     * Primitive Type의 경우 숫자 원시 변수는 0, Boolean은 false(0),
     * Object Reference는 null이 초기값이다.
     */
    

    (물론 개인적으로 가장 좋은 방법은 생성자라 생각한다.)

     

    인스턴스 변수와 지역 변수의 차이점

    인스턴스 변수는 클래스 내에서 선언되는 것으로, Method 내에서 선언을 해도 Method가 종료되면 선언한 변수는 사라진다.

    💌Method Parameter는 Method의 Argument List 내에서 선언되고, 초기화할 이유가 없다.

     

    변수 비교

    원시 변수의 경우 == 을 통해 비교한다.

    레퍼런스의 경우 .equals(tgt)를 통해 비교한다.

    (물론 ==을 사용할 수 있지만, ==은 두 Object가 완전 동일한지를 확인하고 -비트 패턴 체크-, equals의 경우 Object의 내용물이 같은지를 확인한다.)

    💌jisooo.tistory.com/entry/java-hashcode%EC%99%80-equals-%EB%A9%94%EC%84%9C%EB%93%9C%EB%8A%94-%EC%96%B8%EC%A0%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B3%A0-%EC%99%9C-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C

     

    [java] hashcode()와 equals() 메서드는 언제 사용하고 왜 사용할까?

    객체 비교(equals()와 ==) // Object의 기본 equals 메서드 public boolean equals(Object obj) { return (this == obj); } Object 클래스의 equals()는 위와 같은 기능으로써 이 메소드는 비교 연사자인 == 과 동..

    jisooo.tistory.com

     

    'Dev' 카테고리의 다른 글

    [Head First Java] Chapter 2 - 객체 마을로의 여행  (0) 2021.01.20
    Zulu Java 8 설치  (0) 2020.06.05

    댓글

Designed by Tistory.