[자바 프로그래밍] 클래스(1)
🔮 좋은 클래스
- 클래스의 크기는 작아야 한다!
- 멤버 변수의 수를 이용하여 클래스의 크기를 판단해 볼 수 있음
- 하나의 책임만 수행하는 것이 바람직함
- 클래스의 이름은 그 책임을 잘 나타내야 한다.
- 모든 메소드가 모든 멤버 변수를 다 활용하면 good
- 높은 응집성 : 단일 개념을 나타내야 한다.
- 낮은 결합성 : 다른 클래스와의 관계에서 서로에게 영향을 주는 정도가 적어야 한다.
🔮 불변객체(Immutable Class)
💥불변 객체 만드는 방법
1. 멤버변수를final
로 선언한다.
2. 접근(setter) 메서드를 구현하지 않는다
String 클래스는 불변 객체이다.
String str = "apple"; str = "peach"
참조변수 주소 객체 str 100 "apple" str 200 "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; }
Author And Source
이 문제에 관하여([자바 프로그래밍] 클래스(1)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@eunseo-kim/자바-프로그래밍-클래스저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)