본문 바로가기

프로그래밍/Java

Java_객체지향언어(5)_참조변수 super, 생성자 super(), 제어자와 접근제어자

반응형

① 참조변수 super  this(는 지역변수와 인스턴스 변수 구별에 사용.) 

: 조상의 멤버를 자신의 멤버와 구별할 때 사용하고 객체 자신을 가리키는 참조변수이다. 

인스턴스 메서드(생성자) 내에서만 존재하며 static 메서드에서는 사용 불가.

 

class Parent {
	int a = 1;
}

class Child extends Parent {
	int a = 2;
	
	public String toString() {
		return "this: "+this.a+", super: "+super.a;
	}
	
	void display() {
		System.out.println(a);
		System.out.println(this.a);
		System.out.println(super.a);
	}
}

public class personal_oop_InheritanceSuper_test {

	public static void main(String[] args) {
		Child ch = new Child();

		ch.display();
		
		System.out.println(ch);		//toString()자동 호출
	}

}

display()메서드를 호출하면 

a(지역변수)는 가장 가까이 있는 수인 a=2를 출력하고

this.a는 클래스 내의 자기 자신을 가리키기 때문에 a=2를 출력하고

super.a는 조상의 멤버를 가리키기 때문에 1을 출력한다. 

 

② super() ≒ this()

: 조상의 생성자를 호출할 때 사용, 조상의 멤버는 조상의 생성자를 호출해서 따로 초기화한다. 

- 생성자의 첫 줄에 반드시 생성자를 호출해야 함. 

public class Ex7_4{
    public static void main(String args[]){
    	Point3D p=new Point(1, 2, 3);
        System.out.println("x= "+p.x+", y= "+p.y+", z="+p.z);
    }
}

class Point{
    int x, y;
    
    Point(int x, int y){
    	this.x=x;
        this.y=y;
    }
}

class Point3D extends Point{
    int z;
    
    Point3D(int x, int y, int z){
    	super(x, y);	//Point(int x, int y)를 호출
        this.z=z;
    }
}

 

③ 제어자

: 클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다. 

- 접근제어자 : public, protected, (default), private

  그 외 : static, final, abstract, native, transient, synchronized, volatile, strictfp

 

- static : 클래스의, 공통적인

class StaticTest{
    static int width=200;	//클래스 변수(static 변수)
    static int height=120;	//클래스 변수
    
    static { }	//클래스 초기화 블럭
    
    static int max(int a, int b){	//클래스 메서드(static 메서드)
    	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 멤버변수 or 지역변수 : 

> 값을 변경할 수 없는 상수가 된다. 

 

 

- abstract : 추상의, 미완성의 

abstract class AbstractTest{	//추상 클래스 (추상 메서드를 포함한 클래스)
    abstract void move();	//추상 메서드 (구현부가 없는 메서드)
}

→ abstract 클래스 :

> 클래스 내에 추상 메서드가 선언되어 있음을 의미한다.

→ abstract 메서드 : 

> 선언부만 작성하고 구현부는 작성하지 않은 추상메서드임을 의미한다. 

 

→ 추상 클래스는 인스턴스를 생성할 수 없다. 

 

 

④ 접근 제어자 (public, protected, (default), private)

: 멤버 또는 클래스에 사용되어 해당 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 한다. 

제어자 같은 클래스 같은 패키지 자손 클래스 전체
public O O O O
protected O O O  
(default) O O    
private O      

→ 접근 범위가 넓은 순 public > protected > (default) > private

 

⑤ 캡슐화와 접근 제어자

: 접근 제어자를 사용하는 이유는 클래스 내부에 선언된 데이터를 보호하고, 외부에는 불필요한 내부적으로만 사용되는 부분을 감추기 위해서이다.  

이것을 '데이터 감추기'라고 하며 객체지향개념의 '캡슐화'에 해당한다. 

 

<get 메서드>
접근제어자 반환타입 get메서드이름() { 
    return 변수명;
}

<set 메서드>
접근제어자 void set메서드이름() {
    //값을 변경(설정)할 내용 
}

→ getter, setter 메서드

get으로 시작하는 메서드는 멤버변수의 값을 반환(return)하는 일을 하고, 

set으로 시작하는 메서드는 값을 설정하고 조건에 맞는 값일 때만 멤버변수의 값을 변경하도록 작성되어 있다. 

 

 

public class Time{
    private int hour;
    private int minute;
    private int second;
    
    public int getHour(){return hour;}
    public void setHour(int hour){
    	if(hour<0 || hour>23) return;
        this.hour=hour;
    }
    public int getMinute(){return minute;}
    public void setMinute(int minute){
    	if(minute<0 || minute>59) return;
        this.minute=minute;
    }
    public int getSecond(){return second;}
    public void setSecond(int second){
    	if(second<0 || second>59) return;
        this.second=second;
    }

→ 만일 상속으로 확장될 클래스라면 접근 제어자를 private 대신 protected를 사용해야 한다. 

 

반응형