2023. 9. 22. 16:33ㆍJava언어 공부
메소드의 구현
구현하기 전 검토사항
- 객체의 상태를 바꾸는 개체 메소드 vs 바꾸지 않는 클래스 메소드
- 객체 메소드의 위치가 적절한지 ( 다른 클래스에 위치한 게 더 적절할 수 도 있음)
- 메소드의 접근 권한 ( public인지 private인지. 디폴트 값은 private이고, 보통은 public으로 많이 구현 )
- 메소드의 매개 변수의 조건이라던가 매개 변수가 많으면 다른 함수로 구현하는게 나을 수도 있음
- 부작용 검토
사전 조건
메소드의 호출자가 지켜야 하는 요구사항
- 인자 값
- 객체의 상태
사전 조건이 위배된 경우에는?
- 예외 처리 ( throw 등)
- 아무것도 하지 않음
사후 조건
사전 조건에 따라 메소드가 호출되었을 때 메소드 실행 후 보장해야 하는 조건
- 반환 값의 정확성
- 객체의 상태
불변 조건
변하지 않는 조건
- 루프 불변 조건 : 루프가 반복되는 동안 변하지 않는 조건ex) 1부터 n까지의 합을 더한 값을 sum이 갖고 있는다면,sum은 루프가 끝날 때까지 이 더한 값을 가리켜야 한다.
- 클래스 불변 조건 : 이 클래스의 객체가 항상 만족해야 하는 조건ex) 초등학생 학년 상태를 멤버 변수로 가지고 있다면,클래스의 불변 조건은 이 변수의 범위가 항상 1부터 6사이에 있어야 한다.
클래스를 설계할 때 어떤 불변 조건이 있는지 찾아내고, 메소드를 통해 상태가 변하더라도 불변 조건은 계속 만족하도록 구현해야 한다.
부작용
함수가 값을 생성하는 것 외에 상태를 변경하거나 호출한 함수 또는
외부와 의미 있는 상호작용을 한 경우, 부작용이 있다고 한다.
ex) void swap (int* a, int* b)
객체지향에서는 메소드가 호출된 객체 외에 다른 객체의 상태를 변경하면
부작용이 있다고 한다.
=> 바람직하지 않다
인자 전달 방식
자바에서는 값 전달 방식만 있다.
함수를 호출할 때, 인자로 값이 그대로 전달되는 것이 아닌, 복사가 되어 전달되는 것이,
값 전달 (call-by-value)라고 한다.
하지만 원시 타입을 제외한 참조 타입 (객체) 들은 값 전달 방식을 하면,
객체 자체를 전달 하는 것이 아닌, 주소를 전달하게 된다.
자바에서는 한 함수에서 가리키는 주소를 다른 함수에서 절대 바꿀 수 없다.
static 멤버 변수와 메소드
- static 멤버 변수
개별 객체가 유지하는 변수가 아니라 모든 객체가 공유하는 변수이다.
객체를 생성하지 않아도 접근이 가능하다.
- static 메소드
클래스 이름을 이용하여 호출함
숨겨진 매개 변수 this가 없는 메소드이다.
1. static 멤버 변수를 조작/접근하기 위한 메소드
2. 객체를 생성하는 메소드
3. 객체 메소드가 아닌 일반 함수를 정의하기 위해 사용
상수
상수 변수 : 한번 값을 할당하면 더 이상 변경할 수 없다.
선언은 fianl 키워드를 이용한다.
ex) final double PI = 3.142;
클래스의 객체마다 필요없을 경우 => static 사용
외부에서 접근은 할 수 있게 할 경우 => public (하지만 final 때문에 값을 변경 불가)
Static 멤버 변수
public class BankAccount{
private int balance=0;
private int accountNumber;
private static int lastAssignedNumber=0;
public BankAccount(){
++lastAssignedNumber;
accountNumber = lastAssignedNumber;
}
public BankAccount(int amoubt){
this();
deposit(amount);
}
}
public class BankAccount{
private int balance = 0;
private int accountNumber = assignNumber();
private static int assignNumber(){
return ++lastAssignNumber;
}
}
public class BankAccount{
private int balance = 0;
private int accountNumber;
private static int lastAssignedNumber = 0;
{
++lastAssignedNumber;
accountNumber = lastAssignedNumber;
}
public BankAccount(){}
public BankAccount(int amount){
deposit(amount);
}
}
'Java언어 공부' 카테고리의 다른 글
[Java] 9. 상속과 구체화 (1) (0) | 2023.09.26 |
---|---|
[Java-FX] 1. Java FX와 도형 그리기 (1) (0) | 2023.09.24 |
[Java] 7. 클래스 (0) | 2023.09.18 |
[Java] 6. 객체 소개(2) (0) | 2023.09.15 |
[Java] 5. 자바 꼭 알아야 하는 문법 (3) + 객체 소개 (1) | 2023.09.12 |