접근제한자
접근 제어자의 종류
- private : 모든 외부 호출을 막는다.
- default (package-private): 같은 패키지안에서 호출은 허용한다.
- protected : 같은 패키지안에서 호출은 허용한다. 패키지가 달라도 상속 관계의 호출은 허용한다.
- public : 모든 외부 호출을 허용한다
차단 -------------------------------- 허용
private -> default -> protected -> public
캡슐화(Encapsulation)
- 속성(데이터)과 기능(처리 메서드)을 하나로 묶음 - 외부에서의 접근을 제한함 (직접적 변경 방지)
- 외부에 꼭 필요한 기능만 노출하고 나머지는 모두 내부로 숨기는 것
객체의 데이터는 메서드를 통해서 접근해야함 데이터를 숨겨야함!
자바 메모리 구조
메서드 영역, 스택 영역, 힙 영역 세개로 나뉨
- 메서드 영역(Method Area):
- 메서드 영역은 프로그램을 실행하는데 필요한 공통 데이터 관리 / 살행시 한번 로드됨
- 프로그램의 모든 영역에서 공유
- 클래스 정보를 보관
⬇️ 저장내용 ⬇️
- 클래스 정보
- static 영역: static 변수들을 보관
- 런타임 상수 풀: 프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관
- 스택 영역(Stack Area):
- 실제 프로그램이 실행되는 영역
- 메서드 실행시 하나씩 쌓이고 메서드 종료시 제거됨 ---> 스택프레임
- 각 쓰레드별로 하나의 실행 스택이 생성됨
- 힙 영역(Heap Area):
- 객체(인스턴스)와 배열이 생성되는 영역
- new 명령어를 사용시 이 영역을 사용함
- 가비지 컬렉션(GC)이 이루어지는 주요 영역 / 더 이상 참조되지 않는 객체는 GC에 의해 제거됨
- 모든 스레드가 공유
메소드 영역: 프로그램의 설계도. (클래스와 메소드가 정의된 청사진)
힙 영역: 저장 창고. (필요한 데이터를 동적으로 저장하는 공간)
스택 영역: 작업 공간. (작업을 수행하기 위한 임시 공간)
static 변수
- 클래스와 함께 메모리에 로드됨
- 프로그램이 실행되고 클래스가 처음 로드될 때 메모리에 할당되기 때문에 객체를 생성하지 않아도 클래스를 통해 접근이 가능하다. -- 클래스변수임
- 동일한 클래스에서 생성된 모든 객체가 같은 static 변수를 공유함
- 주의 : 모든 객체가 공유하므로 값이 변경될 경우 모든 객체에 영향을 미침
- 메모리 위치 : 힙영역
- static 메소드 역시 클래스로 바로 접근 가능하다.
static 메서드
- static 메서드는 static 만 사용할 수 있다.
- 클래스 내부의 기능 사용 시 static 이 붙은 정적 메서드나 정적 변수만 사용할 수 있음
- 모든 곳에서 static 을 호출가능
- 접근 제어자만 허락한다면 클래스를 통해 모든 곳에서 static을 호출할 수 있음
- 클래스를 통해 바로 접근가능
- static import을 활용하자 ex) import static package이름.클래스명.*;
main()는 정적메서드
- 인스턴스 생성 없이 실행하는 가장 대표적인 메서드
- JVM이 프로그램 실행을 위해 반드시 호출해야 하므로 이름이 고정되어 있음
- 인자 값 String[] args : 커맨드라인 인수를 받을 수 있는 배열.
- public static void main(String[] args) 형태가 반드시 필요 -- > 안그러면 JVM 실행이 안됨
멤버 변수(필드)의 종류
- 인스턴스 변수:
static 이 붙지 않은 멤버 변수
인스턴스를 생성해야 사용할 수 있음
객체 생성 시 각각 할당
객체를 통해서만 접근 가능
객체마다 독립적으로 유지
메모리 위치 : 힙영역
- 클래스 변수: static 이 붙은 멤버 변수
final 변수
- 선언 시 초기화하거나, 생성자에서 초기화해야함 --값을 한 번만 초기화
- 일반적으로 상수를 정의할 때 사용하며, 이름을 대문자로 작성하는 것이 관례임
- 상수는 변하지 않고, 항상 일정한 값을 갖는 수인데, 자바에서는 단 하나만 존재하는 변하지 않는 고정된 값인 static final 키워드를 사용한다
final 메서드 / final 클래스
- 메서드를 오버라이딩할 수 없도록 고정하기 위함 / 클래스를 상속할 수 없도록 고정
상속 extends
- 기존 클래스(부모 클래스)의 특성과 동작을 새 클래스(자식 클래스)에 재사용하거나 확장
- 코드 재사용성, 유지보수성 높임, 확장성(오버라이딩)
- 부모 클래스 (Parent Class):
다른 클래스에 상속되는 기본 클래스.
슈퍼클래스(Superclass)라고도 함.
- 자식 클래스 (Child Class):
부모 클래스의 특성과 동작을 상속받는 클래스.
서브클래스(Subclass)라고도 함.
- private 접근 제한자로 선언된 멤버는 상속되지 않음
- 단일 상속 ---> 대안 : 인터페이스를 사용함으로 다중 구현 가능
- super 키워드 : 부모 클래스의 멤버(필드, 메서드)에 접근하거나 부모 클래스의 생성자를 호출할 때 사용
- 상속 관계를 사용하면 자식 클래스의 생성자에서 부모 클래스의 생성자를 반드시 호출해야 함
- 부모클래스의 생성자가 기본생성자일경우 super() 생략 가능 (자동 호출됨)
- 부모클래스의 생성자가 매개변수가 있는 생성자라면 호출하려면 명시적으로 작성해야 함. super(pram);
- super()는 생성자의 첫 줄에 작성되어야 함
- 상속과 메모리 구조
자식 생성시 내부에서는 상속관계에 있는 부모 인스턴스까지 생성함
자식 메서드 호출시 자식에서 찾고, (호출하는 변수타입에 따라 찾음) 하지만 자식에서 해당 메서드가 없을 경우 부모클래스에서 찾는다. --- 못찾으면 컴파일 오류 발생!
- 자식클래스에서 새로운 기능 추가 가능
- 상속 받은 메서드를 재정의 하는 것 - 오버라이딩
- 메서드 오버로딩은 ?? 메서드 이름이 같고 매개변수가 다른 메서드를 여러개 정의하는 것
- static , final , private 키워드가 붙은 메서드는 오버라이딩 x
- 생성자는 오버라이딩 할 수 없다.