동아리 활동

[JAVA 기초] 클래스, 상속, 접근지시제어자, 오버라이드

떡잎몬 2018. 5. 20. 23:18
반응형

1. JAVA의 클래스

자바의 클래스도 다른 언어와 마찬가지로, 객체를 의미합니다.

객체의 특징으로는, 
1. 상태(State) - 필드(변수)
2. 행동(Behavior) - 메소드

를 모두 가질 수 있다는 것이다. 또한 포인터가 없기 때문에  객체의 함수 또는 변수를 불러오는 경우에는, '->'키워드를 사용하지 않고, 오직 '.' 키워드만을 사용합니다.

<예시>

tv.channel = 7;

또한, JAVA는 다중상속을 지원하는 언어중 하나인데, 이때는 클래스의 함수 내용을 다중으로 상속할 수 없고, 인스턴스 형식으로 껍데기만 불러와 자식클래스에서 내용물을 채우는 형식으로 사용되곤 합니다. 

2. JAVA의 상속

JAVA에서는 상속을 지원하고 있으며, 위에서 언급 했듯이 다중상속도 지원을 하고 있습니다. 
상속은 말 그대로 부모클래스의 모든것을 (private 접근제어자가 있는경우 바로접근하는것은 제한된다) 물려받아 사용할 수 있습니다.
다중상속은 부모클래스를 여러가지 갖는 것을 말하는데, 모든 것을 물려받아 사용하다보면, 부모클래스끼리의 같은 이름의 메서드나 변수가 존재하는경우 충돌이 나 프로램에 큰 이슈가 일어날 수 있기 때문에, 모든것을 물려주는 다중상속은 사용할 수 없습니다. 대신 instance 형식으로 껍데기만 (변수/메소드의 이름만) 상속을 받아 상속받은 자식 클래스에서 구현을 하는 방법으로 다중상속을 구현할 수 있습니다. 상속의 경우 extends 키워드를 사용하며, 다중상속의 경우에는 extends로 모든 속성을 물려받은 부모를 제외하고, implements 키워드를 사용해 여러 부모클래스를 추가로 상속 받을 수 있습니다.

또한, 상속받은 클래스가 생성되는경우, 부모클래스가 먼저 생성됩니다. 따라서 부모클래스의 생성자가 존재하는 경우, 부모클래스의 생성자자식클래스의 생성자보다 먼저 실행됩니다. 

3. JAVA의 접근지시제어자

접근 지시 제어자는 그림과 같이, 4개의 종류가 있으며,

변수 / 함수(메소드) / 클래스를 최초로 선언하는 경우 자료형 선언문의 맨앞에 오게 되는 키워드 입니다.

public static void printValue(Object obj){return ;}

위 소스코드에서 public없애거나, private / protected로 변경할 수 있으며, 변경하는 경우 해당 함수는 위 표에 적혀있는 대로 불러올 수 있는 범위가 제어되게 됩니다. 따라서, 다른 클래스나 함수 등에서 선언된 내용을 불러오는 경우 반드시 접근 지시 제어자를 신경써야만 합니다.


예시를 들어보자면, 

package test_override;

public class class1 {
	public String text;
	private int integerNumber;
	protected float floatNumber;
	boolean onOffSwitch;
}
 

이렇게, public , private, protected, boolean 으로 각각 선언한 class1 이 있다고 가정하겠습니다.

package test_override;

public class class2 extends class1 {
	public class2() {
		text = "텍스트";
		integerNumber = 1;
		floatNumber = 1.0f;
		onOffSwitch = false;
	}
}
 

이렇게, 위에서 선언했던 class1을 상속받는 class2를 만들었다고 가정하면, private로 선언했던 integerNumber에서 컴파일 에러가 나는것을 확인할 수 있습니다.

private는 특성상 같은 패키지여도 불러오는것이 불가능 하기 때문입니다. 

4. JAVA의 오버라이드

JAVA 에서도 오버라이딩(Overriding)이 가능한데, 간단하게 말해서, 부모클래스에서 상속받은 함수를 자식클래스에서 재정의 하는것이 가능합니다. 물론, 처음 부모 클래스에서 선언했던 형식에 맞추어서 선언해야만 합니다.  또한, 접근제어자 같은 경우 축소는 불가하고 확장만 가능 하다고 합니다.  (private -> public 같은 방식으로 가능)

package override01;

class SuperClass {
	public void itis() {
		System.out.println("It's superclass");
	}
}

class SubClass extends SuperClass {
	public void itis() {
		System.out.println("It's subclass");
	}
}

public class OverrideExample {

	public static void main(String[] args) {
		SuperClass sc = new SuperClass();
		SubClass bc = new SubClass();
		sc.itis();
		bc.itis();
	}

}

이런 식으로 SuperClass와 동일한 형식의 함수를 자식클래스인 SubClass에서 선언하고,  내용을 다르게 바꾼다면, 비록 상속을 받았지만, 덮어씌워져 자식클래스의  자식클래스에서 정의된 함수가 실행되게 됩니다.


반응형