-
[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의 내용물이 같은지를 확인한다.)
'Dev' 카테고리의 다른 글
[Head First Java] Chapter 2 - 객체 마을로의 여행 (0) 2021.01.20 Zulu Java 8 설치 (0) 2020.06.05