[자바 프로그래밍] 클래스(1)

9014 단어 JavaJava

🔮 좋은 클래스

  • 클래스의 크기는 작아야 한다!
    • 멤버 변수의 수를 이용하여 클래스의 크기를 판단해 볼 수 있음
    • 하나의 책임만 수행하는 것이 바람직함
  • 클래스의 이름은 그 책임을 잘 나타내야 한다.
  • 모든 메소드가 모든 멤버 변수를 다 활용하면 good
  • 높은 응집성 : 단일 개념을 나타내야 한다.
  • 낮은 결합성 : 다른 클래스와의 관계에서 서로에게 영향을 주는 정도가 적어야 한다.

🔮 불변객체(Immutable Class)

💥불변 객체 만드는 방법
1. 멤버변수를 final로 선언한다.
2. 접근(setter) 메서드를 구현하지 않는다

String 클래스는 불변 객체이다.

String str = "apple";
str = "peach"
  • 참조변수주소객체
    str100"apple"
    str200"peach"
  • 최초에 생성된 String 객체의 값이 변경된 것이 아니라, 새로운 String 객체가 또 생성되어 그 참조가 str 변수에 할당된 것!
  • 초기화 때 가진 값을 소멸할 때까지 그대로 유지
  • 참고로 자바는 const가 없다.
  • java에서는 StringBuffer, StringBuilder와 같이 수정할 수 있는 방법을 추가함

🎨 private 과 public

  • Q. 항상 데이터는 private, 메소드는public?
  • A. 꼭 그렇지 않은 경우도 있다!
    > 상수는 한 번 값이 설정되면 변경할 수 없기 때문에, 굳이 불필요하게 getter을 이용해서 접근할 필요가 없다. 따라서 상수는 public으로 지정해도 된다. 그리고 메소드 중에서도 객체와 상호작용하지 않는 메소드는 private으로 지정하는 경우도 있다!

💍 예외 처리

👠 예외적인 상황의 두 가지 종류

  • 실세계에서 발생 가능한 예외 : ex. 인출에서 잔액보다 큰 금액 인출 요구
  • 프로그래밍 언어의 특성 관련 예외 : ex. 인출에서 음수 금액 인출 요구

→ 서로 다른 예외 상황을 구분하여 프로그래밍 할 수 있어야 한다!


🎃 this

Q. this는 언제 사용할까?

  • 숨겨진 매개변수인 this는 원래 컴파일러를 위한 요소이다. (컴파일러가 이해하기 위한 용도)
  • 그러나 프로그래머도 필요하면 this를 사용할 수 있다.

1. 멤버 변수와 같은 이름의 매개변수를 사용할 때 이를 구분하기 위해 this를 사용한다.

private String name;
public void setName(String name) {
	this.name = name;	
    	//this.name은 private String name, name은 String name
}

2. 하나의 생성자에서 다른 생성자 호출할 때 this 키워드 사용 (이 때는 숨겨진 매개변수로 사용되는 것은 아님)

public class Dog {
	private String name;
    private boolean isFemale;
	public Dog(String name) {
    	this(name, true);
    }
    public Dog(String name, boolean isFemale) {
    	this.name = name;
        this.isFemale = isFemale;
    }
}

// 단, 2번의 경우 this를 이용한 다른 생성자의 호출은 반드시 생성자의 첫 문장이어야 한다.

🔮 메소드의 구현

🍪 메소드 구현 시 검토사항

1. 객체 메소드 vs 클래스 메소드(일반 함수)
: 객체 상태를 전혀 사용하지 않는 등, 객체 메소드로 부적절한 것은 아닐까?

2. 객체 메소드의 위치
: 길이가 긴~ 메소드의 경우, 혹 다른 클래스에 정의하는 것이 더 적절하지는 않은가?

3. 메소드의 접근 권한
: 일단 다 private으로 생각하고, 외부와 상호작용을 하기 위해 꼭 필요한 것만 public으로!

4. 메소드의 사전(매개변수, 객체 상태)/사후 조건(반환값)

  • → Class Invariant : 클래스의 객체가 항상 만족해야 하는 변하지 않는 조건
    • 테스트에서 활용 가능한 조건이 된다.
    • 클래스 설계 시 어떤 클래스 invariant가 있는지 찾아내는 것이 중요하다.
    • 메소드를 구현할 때에도 invariant들이 항상 만족되도록 구현해야 한다.

5. 사용할 테스트 케이스 고려하기
6. 예외적인 상황(2가지 case) 고려하기
7. 부작용 여부 검토


🔮 부작용이 있는 함수

🍞 부작용이 있는 함수 : 함수가 값을 생성하는 것 외에 상태를 변경하거나, 호출한 함수 또는 외부와 의미있는 상호작용을 하는 경우!
ex. void swap(int* a, int* b);같은 함수!

  • 객체 지향에서는 메소드가 호출된 객체 외에 다른 객체의 상태를 변경하면 부작용이 있다고 한다.
  • 부작용이 없으면 디버깅하기에 쉽다.

🧵 값의 출력

//[1]
System.out.prinf("잔액 : %,d원", peter.getBalance());

//[2] 콘솔 응용 제한적
public void printBalance(){
	System.out.prinf("잔액 : %,d원", balance);
}
  • [2]번은 바람직하지 않음.
    출력형태가 고정되어 있고, System.out에 의존하고 있음(높은 결합성, 특정 환경에서만 동작)
  • 비슷하게, 오류메시지를 다음과 같이 콘솔에 직접 출력하는 것도 바람직하지 않음([3]참고)
//[3] 바람직하지 않은 예외 처리
public void deposit(int amount) {
	if(amount<0) System.out.println("오류:...");
    	else balance += amount;
}

좋은 웹페이지 즐겨찾기