class StaticTest {
static int width = 200;
static int heigt = 120;
// 클래스 변수(static변수)
static {
// static변수의 복잡한 초기화 수행
}
// 클래스 초기화 블럭(static 초기화 블럭)
static int max(int a, int b) {
return a > b ? a : b;
}
// 클래스 메서드(static메서드)
}
final class finalTest {
final int MAX_SIZE = 10;
// 값을 변경할 수 없는 멤버변수(상수)
final void getMaxSize() {
final int LV = MAX_SIZE;
// 값을 변경할 수 없는 지역변수(상수)
return MAX_SIZE;
}
// 오버라이딩할 수 없는 메서드(변경불가)
}
// 조상이 될 수 없는 클래스
클래스에서 사용
- 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다.
- final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다.
메서드에서 사용
- 변경될 수 없는 메서드다.
- final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다.
멤버변수, 지역변수에서 사용
- 변수 앞에 final이 붙으면 값을 변경할 수 없는 상수가 된다.
abstract class AbstractTest {
abstract void move();
// 추상 메서드(구현부가 없는 메서드)
}
// 추상 클래스(추상 메서드를 포함한 클래스)
클래스에 사용
- 클래스 내에 추상 메서드가 선언되어 있음을 의미한다.
메서드에 사용
- 선언부만 작성하고 구현부는 작성하지 않는 추상 메서드임을 알린다.
접근 범위가 넓은 순서
public > protected > default > private
예)
public class Account {
private long balance;
private int password;
// 멤버변수는 private 접근제어자를 사용해서 외부 접근을 차단한다.
public static final double DEPOSIT_INT_RATE = 0.03;
// 클래스변수(상수)는 public 접근제어자를 사용해서 공개한다.
public Account() {}
public Account(long balance, int password) {
this.balance = balance;
this.password = password;
}
// 생성자는 public 접근제어자를 사용해서 공개한다.
public void deposit(int amount) { ... }
public void changePassword(int oldPassword, int password) { ... }
// 멤버메서드, 클래스메서드는 public 접근제한을 사용해서 공개한다.
}
캡슐화와 접근 제어자
접근 제어자를 사용하는 이유는 클래스의 내부에 선언된 데이터가 유효한 값을 유지하도록 외부로부터 보호하기 위해서이다.
이것을 데이터 감추기라고 하며, 객체지향개념의 캡슐화에 해당하는 내용이다.접근 제어자를 사용하는 이유
- 외부로부터 데이터를 보호하기 위해서
- 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서
1) 필드
- 객체의 정보를 저장한다. 같은 설계도로 만들어진 객체여도 필드의 값은 서로 다를 수 있다. 필드에 저장된 정보를 이용해서 객체를 구분한다.
2) 생성자
- 객체의 초기화 작업을 담당하는 메소드다. 객체 생성 직후에 실행할 작업을 포함하고 있는 메소드다.
- 메소드명이 설계도 이름과 동일하고, 반환타입을 생략한다.
- 생성자 메소드는 new 키워드(객체를 생성하는 키워드)와 같이 사용된다.
- 생성자 메소드는 매개변수가 없는 기본 생성자 메소드와 매개변수가 있는 생성자 메소드로 구분할 수 있다.
- 기본 생성자 메소드는 컴파일 과정에서 해당 클래스에 생성자가 하나도 정의되어 있지 않으면 컴파일러가 자동으로 추가한다.
- 기본 생성자 메소드 외에 매개변수가 서로 다른 생성자 메소드를 중복정의할 수 있다.
3) 메소드
- 객체의 고유한 기능을 담당한다.
- 객체의 멤버변수(필드)와 상호작용한다.
- 객체들은 다른 객체의 메소드를 호출함으로써 그 객체와 소통한다.
UserService service = new UserService():
- service는 참조변수다
- service는 UserService 설계도로 만들어진 객체의 주소값을 저장할 수 있다.
- new 연산자는 UserService 설계도로 객체를 생성하고,
UserService() 생성자메소드를 실행해서 객체를 초기화한다.
- new 연산자는 사용할 준비된 UserService 객체의 주소값을 service 참조변수에 대입한다.
- service 참조변수는 UserService 객체를 참조하게 되고,
UserService 객체의 공개된 속성과 기능을 사용하기 위해서는 service 참조변수를 이용해야 된다.
예) service.getAllUsers();
service.removeUser("hong");