이번 시간에는 클래스의 접근 지정자와 상속 그리고 static 에 대해 구체적으로 학습했다.
- 패키지
api와 클래스들을 묶어놓은 디렉토리이다.
같은 폴더 내에 있다는 개념으로 이해하면 쉽다.
- 접근 지정자
<4가지의 접근 지정자>
- private: 클래스 내부에서만 접근 가능
- default: 동일 패키지에서 허용(패키지 private) == 같은 디렉토리에 있는 다른 클래스들이 접근 가능
- protected: 동일 패키지에서 허용/자식 클래스에서 접근 가능
- public: 모든 클래스에서 접근 가능
-클래스 접근 지정
top level class: 자신을 감싸는 것이 아무것도 없는 클래스
아무것도 적혀 있지 않으면 default 접근 지정자를 가진 클래스이다.
public class World{
.
.
}
class Local{
.
.
}
top level class에만 public과 default 붙는다!
- 멤버 접근 지정
멤버: 필드 / 메소드 / 클래스도 가능하다! => 멤버인 클래스에는 4가지 다 가능!
아무것도 적혀 있지 않으면 default 멤버이다.
자식 클래스는 다른 패키지에 있어도 protected 멤버에 접근 가능하다.
<protected 멤버 예시>
class A{
void f(){
B b = new B();
}
--------------------------
다른 패키지
public class B{
protected int n;
protected void g(){
n = 5;
}
}
class C{
public void k(){
B b = new B();
b.n = 7; 같은 패키지 내에서 접근 가능
b.g();
}
}
class D extends B{
void f(){
n = 3; //자식 클래스에서 접근 가능
g();
}
}
- static
static은 공유한다는 개념으로 이해하자. 또한, 객체가 생성되기 전에 이미 생성된다는 사실이 중요하다.
- 클래스 로딩 시에 이미 메모리에 할당되어 있다.
- 클래스 당 하나만 생성해야 한다.
- 모든 객체들에 의해 공유된다.
==> static의 멤버를 객체의 멤버로 접근할 수 있다.
==> static의 멤버를 클래스 이름으로 바로 접근할 수 있다./ 객체를 생성하지 않고도 바로 이용 가능
class StaticSample{
public int n;
public void g(){
m = 20;
}
public void h(){
m = 30;
}
public static int m;
public static void f(){
m = 5;
}
}
public class Ex{
public static void main(String[] args){
StaticSample.m = 10; //객체를 생성하지 않고 바로 접근
StaticSample s1;
s1 = new StaticSample();
.
.
StaticSample.f(); //m의 값은 5
}
}
따라서 Math 클래스의 경우 모든 필드와 메소드가 public static이라 Math.메소드() 이런 식으로 사용할 수 있다.
Math클래스는 아예 객체의 생성을 금지시켰다.
--제약조건 1: static 메소드는 non - static 멤버에 접근할 수 없다.
==> 객체가 생성되지 않았을 때 static 메소드는 이미 실행될 수 있는 상태이다.
따라서 사용 불가하다.
--제약조건 2: static 메소드에서 this를 사용할 수 없다.
==> 마찬가지로 객체가 생성되지 않은 상황에서도 호출이 가능
따라서 현재 객체를 가리키는 this 사용 불가하다.
- 상속
상속은 유지 보수, 확장 등에 유리하여 생산성 향상에 도움을 준다.
- 선언 : extends 라는 키워드를 사용하여 선언한다.
부모 클래스 -> 슈퍼 클래스
자식 클래스 -> 서브 클래스
- 특징 : 클래스의 다중 상속은 지원하지 않는다.
ex) class A extends B extends C 이런 거
모든 클래스는 Object클래스를 상속 받는다.
object 클래스 내부에는 많은 메소드들이 들어 있다.
그렇다면 class A extends B extends Object?
이는 class B extends Object{...}
class A extends B{...} 로 해결된다.
- 상속에서의 접근 지정자
슈퍼 클래스에 private멤버가 있다면 서브 클래스에서 접근 불가능하다.
하지만, 메소드를 통해 연결하게 할 수 있다.
자식 클래스 타입의 객체가 생성될 때 부모 클래스의 멤버도 생성된다.
- 상속에서의 생성자 호출
서브 클래스 객체가 생성 -> 서브, 슈퍼 클래스의 생성자 모두 실행된다.
- 호출 순서: 서브 클래스의 생성자 먼저 호출, 실행 전에 슈퍼 클래스의 생성자를 호출
- 실행 순서: 슈퍼 클래스 먼저 실행 후, 서브 클래스의 생성자 실행
----생성자 선택: 슈퍼, 서브 클래스 각각 여러 생성자 작성 가능
서브 클래스 생성자에서 슈퍼 클래스 생성자 하나 선택 --> 선택 안하면 기본 생성자(매개변수가 없는 생성자) 선택
=> super() 키워드를 사용하여 슈퍼 클래스의 생성자를 선택한다!
class A{
public A(int x){ //한 개라도 작성 되어 있으면 기본 생성자 만들지 않음
System.out.println("생성자A"); // 오류 발생!!
}
}
class B extends A{
public B{ //실행 전에 부모 클래스의 생성자 호출
System.out.println("생성자B");
}
}
public class Constructor2{
public static void main(String[] args){
B b;
b = new B();
}
}
선택을 하지 않으면 자동으로 기본 생성자를 선택한다.
class A{
public A(){ //선택 하지 않아서 이걸 자동으로 선택한다!
System.out.println("생성자A");
}
public A(int x){
System.out.println("생성자A");
}
}
class B extends A{
public B{
System.out.println("생성자B");
}
public B(int x){ //실행 전에 부모 클래스의 생성자 호출
System.out.println("매개변수생성자B");
}
}
public class Constructor2{
public static void main(String[] args){
B b;
b = new B(5); 매개변수 있음
}
}
출력 : 생성자A -> 매개변수생성자B
super() 사용
서브 클래스의 생성자 코드 첫 줄에 와야한다!
명시적으로 표기
클래스의 상속과 static 중점으로 기록했다.
실습을 통해 상속의 장점을 직접 사용해봐야겠다!
'자바기반응용프로그래밍' 카테고리의 다른 글
4. 클래스와 상속(1) (0) | 2025.09.23 |
---|---|
3. 자바 문법 (2) (0) | 2025.09.17 |
2. 자바 문법 (1) (1) | 2025.09.12 |
1. 자바 입문 (0) | 2025.09.12 |