본문 바로가기

자바기반응용프로그래밍

5. 클래스와 상속(2)

이번 시간에는 클래스의 접근 지정자와 상속 그리고 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