자바 이론# 다형성~네트워크

codePark·2020년 5월 29일
0

Java-이론편

목록 보기
6/6

다형성

다형성(Polymorphism) 개요

  • 여러 개의 형태를 갖는다는 의미로, 객체 지향 프로그래밍의 3대 특징 중 하나.
  • 상속을 이용한 기술로, 자식 객체를 부모 클래스 타입의 변수로 다룰 수 있다.
  • 메소드 호출시 다형성을 이용하여 부모 타입의 매개변수를 사용하면 자식 타입의 객체를 받을 수 있다.
Family[] fml = new Family[3];
fml[0] = new Daughter();
fml[1] = new Son();
fml[2] = new Puppy();

FamilyPicnic(new Daughter());
FamilyPicnic(new Son());
FamilyPicnic(new Puppy());

클래스 형변환

  • Upcasting(자동):
    상속관계에 있는 부모 타입의 참조형 변수가 모든 자식 타입의 객체 주소를 받을 수 있다.
  • Downcasting(명시적 형변환 필요):
    자식 객체의 주소를 받은 부모 참조형 변수를 가지고 자식의 멤버를 참조해야 할 경우,
    후손 클래스 타입으로 참조형 변수를 형변환 해야 한다.
//Upcasting
Family fml = new Son();
Family fml = new Daughter();

//Downcasting
((Daughter)d).studentFamilyGoToSchool(); //Daughter의 고유 메소드 호출
((Son)s).childrenFamilyGoToPlayground(); //Son의 고유 메소드 호출

instanceof 연산자

  • 현재 참조형 변수가 어떠한 클래스 형의 객체 주소를 참조하고 있는지 확인할 때 사용,
    클래스 타입이 맞으면 true, 아니면 false값을 리턴한다.
public void familAtTheMorning(Famimly f)
	if(d instanceof Family){ //Daughter d = new Daughter();일 때
	((Daughter)d).studentFamilyGoToSchool(); 
	//Daughter의 레퍼런스 d가 Family의 후손 클래스가 맞다면, 
	//Daughter의 고유 메소드 호출

	}else if (s instanceof Family){
	((Son)s).childrenFamilyGoToPlayground();
	//Son의 레퍼런스 s가 Family의 후손 클래스가 맞다면, 
	//Son의 고유 메소드 호출
}

바인딩(Binding)

  • 실제 실행할 메소드 코드와 호출하는 코드를 연결시키는 것.
  • 정적 바인딩(자동): 프로그램이 실행되기 전에 컴파일이 되면서 모든 메소드는 정적 바인딩이 실행된다.
  • 동적 바인딩: 상속 관계로 이루어져 다형성이 적용된 경우에, 메소드 오버리이딩이 되어 있으면 정적으로 바인딩 된 메소드 코드보다 오버라이딩 된 메소드 코드를 우선적으로 수행하게 된다.

추상 클래스(Abstract Class)/추상 메소드(Abstract Method)

추상 클래스: abstract가 있는 메소드를 포함한 클래스. 클래스 선언부에 abstract 키워드 작성.
추상 메소드: Body가 없는 메소드로, 메소드의 선언부에 abstract 키워드를 사용항 선언한다. 상속시, 반드시 구현해야 하는 메소드이며 Overriding이 강제된다. (구현하지 않을 시 Compile 에러 발생.)

  1. 미완성 클래스(abstract class) 자체적으로 객체 생성 불가, 반드시 상속하여 객체 생성 하여야 한다.
  2. abstract 메소드가 없어도 abstract 클래스 선언 자체는 가능하다.
  3. 일반적인 메소드, 변수를 포함할 수 있다.
  4. 객체 생성은 불가능 하나, 참조형 변수로는 사용이 가능하다.
public abstract class AbstractClassTest{ //추상 클래스
	public abstract void familyAtTheMorning(); //추상 메소드
}

인터페이스(Interface)

  • 상수형 필드와 추상 메소드만을 작성할 수 있는 추상 클래스의 변형체. 메소드의 통일성을 부여하기 위해서 추상 메소드만 따로 모아 놓은 것으로, 상속시 인터페이스 내에 정의된 모든 추상 메소드를 구현해야 한다. 즉, 모든 인터페이스의 메소드는 묵시적으로 public abstract이다.

  • 상위 타입의 역할로 다형성을 지원하여 연결해 주는 역할을 수행한다.

  • 해당 객체가 다양한 기능을 제공하는 경우에도 인터페이스에 해당하는 기능만을 사용하도록 제한이 가능하다.

  • 공통 기능상의 일관성을 제공하여, 공동 작업을 위한 인터페이스를 제공한다.

public interface InterfaceName{

publc static final int PORT = 1025;
	[public abstract] int CallPort (Network n);
	//[public abstract]는 생략되기 때문에 오버라이딩시 public 표기 필요.
}

Interface / Abstract Method

  • Interface: 다중 상속, implements, 모든 메소드는 abstract
    묵시적으로 abstract, 객체 생성 불가, reference 타입 용도
  • Abstract Class: 단일 상속, extends, abstract 메소드 0개 이상 포함
    명시적으로 abstract 사용, 객체 생성 불가, reference 타입 용도

예외처리(Exception Handling)

오류의 종류

  • Compile time Error(Checked Error): 컴파일 단계에서 발생되는 에러.
  • Runtime Error(Unchecked Error): 실행 단계에서 발생되는 에러.
  • Logical Error: 문법상 문제는 없으나 개발자의 의도대로 작동하지 않는 에러.
  • System Error: 컴퓨터 오작동으로 인한 에러. 소스 구문으로 해결 불가

Error와 Exception의 구분

  • Error: 프로그램 수행시 치명적 상황이 발생한 것으로, 소스상 해결이 불가능한 경우를 말한다.
    발생시 프로그램이 비정상 종료되며, 개발자가 수정할 수 없다.
    (ex. OutOfMemoryError, StackOverflowError등)
  • Exception: 프로그램 오류 중 적절한 코드에 의해서 수습될 수 있는 오류로, 예외 발생 상황을 개발자가 예측하여 미리 예외 처리 코드를 작성하는 것으로 Handling 할 수 있다.
    (ex. NullPointerException, ArithmeticException, IOException등)

Checked Exception/Unchecked Exception의 구분

  • CheckedException(非RuntimeExcpetion 후손): 소스 코드 상에서 반드시 개발자가 처리해야 하는 Checked Exception(확인 가능 예외)이란 Runtime Exception의 후손이 아닌 Exception등을 일컫는다. 즉, 프로그램을 실행하지 않아도 컴파일 단계에서 에러가 있음을 확인할 수 있는 경우이다. 여기에는 IOException, EOFException, FileNotFoundException등이 있다.

  • UnckeckedException(RuntimeException 후손): 소스 코드 상에서 개발자가 반드시 처리하지는 않아도 되는 경우이자 대개 개발자의 부주의로 인해 발생 즉 Unchecked(확인되지 않는) 경우이다. 이들은 RuntimeException의 후손으로, 컴파일 시에는 오류가 있음을 알 수 없고 프로그램을 실행시킨 후에 에러가 있음을 알 수 있다. 여기에는 ArithmeticException(산술 예외), NullPointerException(Null 예외), ArrayIndexOutOfBoundsException(인덱스 범위 예외)등이 포함된다.

RuntimeException 후손 클래스

  • ArithmeticException
  • NullPointerException
  • NegativeArraySizeException
  • ArrayIndexOutOfBoundException
  • ClassCastException
profile
아! 응애에요!

0개의 댓글