[JAVA] 5.클래스 상속 및 인터페이스

min·2024년 9월 18일

JAVA

목록 보기
6/10

클래스 상속 및 인터페이스

객체(object) = 행위(behavior) + 상태(state) + 정체성(identity)

객체지향의 특징

  • 캡슐화
    객체의 구성 요서인 행위와 상태를 하나의 틀에 연결하는 것을 캡슐화(encapsulation)라고 한다.
  • 상속
    상속(inheritance)이란 기존의 정의한 클래스에서 새로운 클래스로 상속받아 정의되는 것.
  • 폴리모피즘
    폴리모피즘(polymorphism)은 다른 클래스에 있는 메서드를 수행했을 때 의미적으로 같은 결과를 내보는 것.
  • 동적인 사용
    객체의 타입은 선언 시에 정해지는 것이 아니라 객체를 생성하는 단계에서 결정되어 진다.

객체 관계 및 상속 관계

객체와 객체 사이에는 일정한 관계성이 있다.
객체간의 관계는 'is part of''has a'의 관계이다.

상속 관계

  • 상속 관련 용어
상위 클래스(super class)하위 클래스(sub class)
부모 클래스(parent class)자녀 클래스(child class)
기본 클래스(base class)파생 클래스(derived class)

기본 클래스에서 파생 클래스로 상속 받을 때 사용하는 키워드는 extends 이다.

public class subclassname extends superclassname {}

this와 super 키워드

객체 자신에 대한 참조가 필요한 경우 this를 사용하고,
부모 클래스에 대한 참조를 필요로 하는 경우에는 super를 사용한다.

this

객체 자신에 대한 참조가 필요한 경우 사용

  • 인수 명과 변수 명의 혼돈을 막기 위해 사용
  • 클래스 자신에 대한 참조를 다른 메서드에 전달 할 때 사용
  • 클래스의 생성자를 호출할 때 사용
  • 클래스의 파라미터 전달 과정에서 사용(Frame, ImageObserver 등)
class ThisTest{	
	int value;
	
	public ThisTest(int value) {
		this.value = value;		// 변수명의 혼동을 피하기 위해 사용
		
		sendAccess(this);	// 클래스 자신에 대한 참조를 다른 메서드에게 전달
	}
	
	public ThisTest() {
		this(100);	// 클래스의 생성자 ThisTest(int value)를 호출
	}
}

super

부모 클래스에서 상속 받은 멤버 중에서 재정의 된 멤버를 참조할 때 사용하거나, 부모 클래스의 생성자를 호출하여 부모 클래스가 가지고 있는 멤버를 초기화 할 때 사용한다.

class MyDialog extends Dialog{
	
	public MyDialog(Frame f) {
		// Dialog의 생성자를 호출하여 Dialog의 변수를 초기화
		super(f, "dialog Title", true);
	}
	
	public boolean handleEvent(Event e) {
		if(e.id == Event.WINDOW_DESTROY) {
			hide();
			dispose();
			System.exit(0);
		}
		else if(e.id != Event.MOUSE_DOWN) {
			// 재정의된 Dialog의 메서드 handleEvent를 호출
			return super.handleEvent(e);
		}
		
		return true;
	}
}

Java 클래스 접근 제어

클래스 멤버 지시자의 적용 범위

지시자class 내package 내subclass 에서외부 접근
publicOOOO
protectedOOOX
지시자 없음OOXX
privateOXXX

Abstract 클래스와 Interface 클래스

Abstract 클래스

추상 클래스의 작성 규칙

  1. 클래스 선두에 abstract라는 키워드가 온다.
  2. 반드시 하나 이상의 abstract 메서드가 있어야 한다.
  3. abstract 메서드는 코드 구현 없의 정의한다.
  4. abstract 클래스를 상속받는 클래스는 abstract 메서드를 재정의해야 한다.
// 추상 클래스
abstract class Animal{
	int numOfFoot;
	
	public abstract void run();
	public abstract void cry();
}

//-------------------------------------
class Dog extends Animal{
	public void run() {
		System.out.println("running");
	}
	public void cry() {
		System.out.println("bark!!");
	}
}

//-------------------------------------
class Cat extends Animal{
	public void run() {
		System.out.println("running");
	}
	public void cry() {
		System.out.println("mewing!!");
	}
}

Interface 클래스

Interface 클래스도 추상 클래스와 비슷하지만 차이점이 있다.

public interface ActionListener extends EventListener {
	void actionPerformed(ActionEvent e);
}

public interface MouseListener extends EventListener {
	void mouseClicked(MouseEvent e);
	void mouseEntered(MouseEvent e);
	void mouseExited(MouseEvent e);
	void mousePressed(MouseEvent e);
	void mouseReleased(MouseEvent e);
}

public class MyGUI extends Frame implements ActionListener{
	public MyGUI() {...}
	public void actionPerformed(ActionEvent e) {
		// 이벤트 발생 시 처리할 내용
	}
}

Inner 클래스와 Anonymous 클래스

Inner 클래스는 클래스 안에 작성하는 클래스를 말한다.
Inner 클래스 에는 지역 Inner 클래스와 Anonymous Inner 클래스가 있다.

Inner 클래스

이너클래스를 사용하는 이유

  • 클래스를 용도에 따라 하 그룹으로 잡아주는 효과
  • 캡슐화 기능 강화
  • 가독성이 높아지고 유지보수가 용이
  • Inner 클래스에서 외부 클래스에 있는 자원(변수, 메서드) 호출 용이
// 지역 inner 클래스의 예제
public class Test {	
	Calc c;	// inner 클래스 객체 선언
	int x=5;
	
	public Test() {
		c = new Calc();
		c.print();
	}
	
	// inner class
	class Calc{
		float PI=3.14f;
		
		void print() {
			//Test클래스의 x멤버 참조 가능
			System.out.println("PI * X=" + PI*x);
		}
	}
	
	public static void main(String[] args) {

		Test at = new Test();
	
	}
}

PI * X=15.700001

Anonymous 클래스

클래스 객체 생성 시 객체의 구현사항을 메서드의 괄호 안에서 작성하는 방법으로 이름없는(Anonymous) Inner 클래스를 사용할 수 있다.

button.addActionListener(new ActionListener() {
	public void actionPerfored(ActionEvent e) 
	{
		//do something
	}
});

Java 패키지

패키지는 일정한 클래스들의 그룹을 말하는 데 JVM에서 제공하는 것들도 있고 사용자가 만들어 사용할 수도 있다.

Java 언어 패키지를 만드는 순서

  1. Java 언어 소스 프로그램의 첫 줄에 다음 줄을 추가한다.
    package MyPackageName;
  2. Java 언어 소스 프로그램을 컴파일 한다. 아래와 같이 컴파일 하면
    $HOME/classesMyPackageName에 MyProgram.class가 저장된다.
    javac - d $HOME/classes MyProgram.java
  3. 시스템의 CLASSPATH 환경 변수에 경로를 추가한다.
    set CLASSPATH=%CLASSPATH%;$HOME/classes;

패키지의 사용

패키지를 사용할 때는 import 키워드를 사용한다.

대표적인 Java 패키지

  • java.awt
    그래픽 사용자 인터페이스를 만드는 데 사용되는 패키지로 메뉴, 버튼, 스크롤바, 색 지정 등에 관련된 패키지

  • java.io
    Java 언어 어플리케이션 프로그램에서 파일 입출력을 처리하는 패키지

  • java.lang
    Java 언어의 기본 패키지로 기본 타입에 대한 정의 Object, Exception, Float, Math, String 등에 관련된 패키지
    import 하지 않아도 자동으로 불려온다.

  • java.net
    TCP/IP 클라이언트 서버 네트워킹을 지원하는 Socket, DatagramPacket 등과 HTTP, URL 또는 FTP 등의 프로토콜에 관련된 패키지

  • java.util
    프로그램 중에 만힝 사용될 수 있는 알고리즘에 대한 지원 클래스로 Stack, Dictionary, Vector 등의 클래스를 가지고 있는 패키지

  • javax.swing
    스윙의 기본 패키지로 컴포넌트, 어탭터, 기본 컴포넌트 모델에 대한 클래스를 가지고 있다.

  • javax.swing.event
    java.awt.event 타입 외에 스윙의 특별한 이벤트를 정의하고 있다.

0개의 댓글