자바의 정석(남궁성) 독후감 형식의 글입니다
현실 세계를 프로그램의 세계에서 표현하기 위한 방법 p.230
p.231 일단 프로그램을 기능적으로 완성한 다음 어떻게 하면 보다 객체지향적으로 코드를 개선할 수 있을지를 고민하여 점차 개선해 나가는 것이 좋다 → 리팩터링
p.232 인스턴스와 객체는 같은 의미지만 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖는다.
- 변수 : 하나의 데이터를 저장할 수 있는 공간
클래스변수를 참조할 때는 ‘클래스이름.클래스변수’의 형태로 하는 것이 좋다. 인스턴스 참조 변수를 통해서도 클래스변수를 사용할 수 있지만 이렇게 하면 클래스 변수를 인스턴스 변수로 오해하기 쉽기 때문이다. p.249
메서드를 사용하는 이유
메서드의 선언부는 후에 변경사항이 발생하지 않도록 신중히 작성해야 한다. 메서드의 선언부를 변경하게 되면, 그 메서드가 호출되는 모든 곳도 같이 변경해야 하기 때문이다. →하지만 너무 겁먹지 말자. 우리에게는 강력한 리팩토링 기능을 제공하는 IDE가 있다
메소드의 실행을 강제로 종료하는 효과
return문을 어떻게 쓰면 좋을까 : https://stackoverflow.com/questions/1419278/control-flow-via-return-vs-if-else
public ActionResult Edit(MyClass class)
{
if (!class.Editable)
return null;
class.Update();
return View();
}
public ActionResult Edit(MyClass class)
{
if (class.Editable)
{
class.Update();
return View();
}
else
{
return null;
}
}
public ActionResult Edit(MyClass class)
{
ActionResult rv = null;
if (class.Editable)
{
class.Update();
rv = View();
}
return rv;
}
p.260 매개변수의 유효성 검사 : IllegalArgumentException을 쓰자
float divide(int x, int y) {
// 작업을 하기 전에 나누는 수(y)가 0인지 확인한다
if(y == 0) {
System.out.println("0으로 나눌 수 없습니다.");
return 0; // 매개변수가 유효하지 않으므로 메서드를 종료한다.
}
return x / (float)y;
}
재귀호출에서 종료조건이 체크되지 못하는 경우 StackOverflowError 발생
인스턴스와 관계없는(인스턴스 변수나 인스턴스 메서드를 사용하지 않는) 메서드를 클래스 메서드(static메서드)로 정의한다.
class Fee() {
public int payment;
public static int calculatePayment(int amount) {
return amount + 1;
}
}
class Client() {
public int getFee() {
Fee fee = new Fee();
fee.calculatePayment(100); // fee.payment = fee.calculatePayment(100);
System.out.println("fee=" + fee.payment);
}
}
알아두면 좋아요!(p.282) → 하지만 이런식으로 사용할거면 클래스 메소드로 만들어야 한다. 왜냐하면…
int result = new MemberCall().instanceMethod1();
public int calculate(int a) {
return calculate(a, 0);
}
public int calculate(int a, int b) {
return calculate(a, b, 0);
}
public int calculate(int a, int b, int c) {
// 실제 로직
}
생성자에서 다른 생성자를 호출할 때는 첫 줄에서만 가능하다.
class Car {
String color;
String gearType;
int door;
// 2줄 짧음. 메소드명만으로 로직을 알 수 없음
Car(Car c) {
color = c.color;
gearType = c.gearType;
door = c.door;
}
// 2줄 더 길다. 메소드명만으로 로직을 알 수 있음
public Car copy() {
Car copied = new Car();
copied.color = color;
copied.gearType = gearType;
copied.door = door;
return copied;
}
}
...
Car original = new Car();
...
**Car copied = new Car(original);
Car copied = original.copy();**
...
무조건 최대한 빨리 초기화 하기
멤버변수(클래스변수와 인스턴스변수)와 배열의 초기화는 선택적이지만 지역변수의 초기화는 필수적이다
클래스 초기화 블럭 : 클래스 변수의 복잡한 초기화에 사용된다. 인스턴스 초기화 블럭 : 인스턴스 변수의 복잡한 초기화에 사용된다.