230323 - java(8)

팝콘·2023년 3월 23일

Java

목록 보기
7/17

1. 제어자

  • 클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다.
  • 접근제어자
    - public, protected, (default), private
  • 그 외
    - static, final, abstract, native, transient, synchronized, volatile, strictfp

static

  • '클래스의' 또는 '공통적인'의 의미를 가지고 있다.
  • 멤버변수, 메서드, 초기화 블럭에 사용된다.
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메서드)
}
  • 멤버변수에 사용
    - 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다.
    - 클래스 변수는 인스턴스를 생성하지 않고도 사용 가능하다.
    - 클래스가 메모리에 로드될 때 생성된다.
  • 메서드에 사용
    - 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다.
    - static 메서드 내에서는 인스턴스멤버들을 직접 사용할 수 없다.
  • 초기화 블럭에 사용
    - 생성자보다 먼저 실행된다.
    - 설계도가 메모리에 로딩되면 블록내의 수행문이 자동으로 실행된다.
    - 객체 생성되지 않아도 설계도가 메모리에 로딩만 되면 실행된다.
    - 클래스가 메모리에 로딩될때 같이 실행된다.

final

  • 마지막의' 또는 '변경할 수 없는'의 의미를 가지고 있다.
  • 거의 모든 대상에 사용될 수 있다.
final class finalTest {
	final int MAX_SIZE = 10;
    // 값을 변경할 수 없는 멤버변수(상수)
    
    final void getMaxSize() {
    	final int LV = MAX_SIZE;
        // 값을 변경할 수 없는 지역변수(상수)
        return MAX_SIZE;
    }
    // 오버라이딩할 수 없는 메서드(변경불가)
}
// 조상이 될 수 없는 클래스
  • 클래스에서 사용
    - 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다.
    - final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다.

  • 메서드에서 사용
    - 변경될 수 없는 메서드다.
    - final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다.

  • 멤버변수, 지역변수에서 사용
    - 변수 앞에 final이 붙으면 값을 변경할 수 없는 상수가 된다.

abstract

  • '추상의' 또는 '미완성의'의 의미를 가지고 있다.
  • 클래스, 메서드에 사용된다.
abstract class AbstractTest {
	abstract void move();
    // 추상 메서드(구현부가 없는 메서드)
} 
// 추상 클래스(추상 메서드를 포함한 클래스)
  • 클래스에 사용
    - 클래스 내에 추상 메서드가 선언되어 있음을 의미한다.

  • 메서드에 사용
    - 선언부만 작성하고 구현부는 작성하지 않는 추상 메서드임을 알린다.

접근 제어자

  • 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 한다.
  • 클래스, 멤버변수, 메서드, 생성자에 사용된다.
  • private 접근제한자와 public 접근제한자를 주로 사용한다.
  • 속성은 감추고 기능은 공개한다.
  • private
    - 같은 클래스 안에서만 접근을 허용한다.
  • default
    - 접근제한자를 지정하지 않으면 적용되는 기본 접근제한자다.
    - 같은 패키지 안에서만 접근을 허용한다.
  • protected
    - 같은 패키지 안에서만 접근을 허용하지만 자식 클래스에서는 패키지가 서로 달라도 접근이 허용된다.
  • public
    - 전체공개. 전부 접근이 가능하다.

접근 범위가 넓은 순서
public > protected > default > private

  • 주의점
    - 접근제어자는 매개변수, 메소드내의 지역변수에는 적용할 수 없다.
    - 클래스에는 default와 public 접근제한만 가능하다.
    - 필드(멤버변수, 클래스변수), 생성자, 메서드(멤버메서드, 클래스메서드)는 private, default, protected, public 접근제한을 적용할 수 있다.
예)
	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 접근제한을 사용해서 공개한다.
	}

캡슐화와 접근 제어자

  • 접근 제어자를 사용하는 이유는 클래스의 내부에 선언된 데이터가 유효한 값을 유지하도록 외부로부터 보호하기 위해서이다.
    이것을 데이터 감추기라고 하며, 객체지향개념의 캡슐화에 해당하는 내용이다.

  • 접근 제어자를 사용하는 이유
    - 외부로부터 데이터를 보호하기 위해서
    - 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서


2. 중간 정리

클래스

  • 객체를 생성할 때 사용되는 설계도다.
  • 클래스의 구성요소

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");
profile
터짐

0개의 댓글