[기본 개념]

 

프로세스(process) : 애플리케이션을 실행하면 운영체제로부터 실행에 필요한 메모리를 할당받아 애플리케이션을 실행하는 것

스레드(thread) : 프로세스 내부에서 코드의 실행 흐름을 의미함.


스레드

 

https://gosmcom.tistory.com/19

 

  • 멀티 프로세스(multi process) : 자신의 메모리를 가지고 실행하므로 서로 독립적이지만, 멀티 스레드는 하나의 프로세스 내부에 생성되므로 스레드 하나가 예외를 발생시키면 다른 스레드도 영향을 받는다. 따라서 멀티 스레드는 예외처리를 잘 해줘야 한다.
  • 멀티 스레드(multi thread) : 하나의 프로세스 내에 동시 실행을 하는 스레드들이 2개 이상인 경우
  • 스레드(thread) : 사전적 의미로 한 가닥의 실이라는 뜻. 한 가지 작업을 실행하기 위해 순차적으로 실행할 코드를 실처럼 이어놓았다고 해서 유래된 이름
  • 멀티 스레드의 사용 
    • 대용량 데이터 처리 시간을  줄이기 위해 데이터를 분할해서 병렬로 처리
    • UI를 가지고 잇는 애플리케이션에서 네트워크 통신을 하기 위해 사용
    • 다수 클라이언트의 요청을 처리하는 서버를 개발할 때 사용

 

메인 스레드

 

https://azderica.github.io/10-java-study/

 

  • 자바의 모든 애플리케이션은 메인 스래드가 main() 메소드를 실행하면서 시작된다.
  • 메인 스레드는 main() 메소드의 첫 코드부터 아래로 순차적으로 실행하고, main() 메소드의 마지막 코드를 실행하거나 return문을 만나면 실행이 종료된다.
  • 메인 스레드는 필요에 따라 작업 스레드들을 만들어서 병렬로 코드를 실행할 수 있다. 즉, 멀티 스레드를 생성해서 멀티 태스킹을 수행한다.

 

작업 스레드 생성과 실행

  • 멀티 스레드로 실행하는 애플리케이션을 개발하려면 먼저 몇개의 작업을 병렬로 실행할지 결정하고 각 작업별로 스레드를 생성한다.
  • 모든 애플리케이션은 메인 스레드가 반드시 존재하기 때문에, 메인 작업 이외에 추가적인 병렬 작업의 수만큼 스레드를 생서하면 된다.
  • 자바에서는 작업 스래드도 객체로 생성되기 때문에 클래스가 필요하다.

< 클래스 생성하는 방법 >

 

① Thread 클래스로부터 직접 생성

  • java.lang.Tread 클래스로부터 작업 스래드 객체를 직접 생성하려면 다음과 같이 Runnable을 매개값으로 갖는 생성자를 호출한다.
  • Thread thread = new Thread(Runnable target);
  • 다음과 같이 Runnable 구현 클래스를 작성한다.
Thread thread = new Thread(new Runnable) {
	public void run(){
    
    	스래드가 실행할 코드; //익명 구현 객체
    
    }
}
  • 위와 같이 Thread 생성자를 호출할 때 Runnable 익명 객체를 매개값으로 사용할 수 있다.
  • 작업 스레드는 생성되는 즉시 실행되는 것이 아니라, start() 메소드를 호출해야만 실행이 된다.
  • thread.start();

 

https://gosmcom.tistory.com/20

② Thread 하위 클래스로부터 생성

  • 작업 스레드가 실행할 작업을 Runnable로 만들지 않고, Thread 하위 클래스로 작업 스레드를 정의하면서 작업 내용을 포함시키는 방법
  • Thread 클래스를 상속한 후 run() 메소드를 재정의해서 스레드가 실행할 코드를 작성한다.
public class WorkerThread extends Thread {
	@Override
	public void run(){
    
    	스래드가 실행할 코드; //run 메소드 재정의
    
    }
}
Thread thread = new WorkerThread();
  • 코드를 더 절약하기 위해 다음과 같이 Thread 익명 객체로 작업 스레드 객체를 생성할 수도 있다.
Thread thread = new Thread(){
	public void run(){
    
    스레드가 실행할 코드; //익명 자식 객체
    
    }
};

 

③ 스레드의 이름

  • 스레드는 자신의 이름을 가지고 있다. 
  • 스레드의 이름이 큰 역할을 하는 것은 아니지만, 디버깅할 때 어떤 스레드가 어떤 작업을 하는지 조사할 목적으로 사용된다.
  • 스레드 이름 설정 : thread.setName("스레드 이름");
  • 스레드 이름 조회 : thraea.getName();

 

동기화 메소드

① 공유 객체를 사용할 때의 주의할 점

  • 멀티 스레드 프로그램에서 스레드들이 객체를 공유해서 작업해야 하는 경우
  • 스레드 A가 사용하던 객체를 스레드 B가 상태를 변경할 수 있기 때문에 주의해야 한다.

② 동기화 메소드

  • 스레드가 사용 중인 객체를 다른 스레드가 변경할 수 없게 하려면 스레드 작업이 끝날 때 까지 객체에 잠금을 걸어 다른 스레드가 사용할 수 없도록 해야 한다.
  • 멀티 스레드 프로그램에서 단 하나의 스레드만 실행할 수 있는 코드 영역을 임계 영역(critical section)이라 한다.
  • 자바는 임계 영역을 저장하기 위해 동기화(synchronized) 메소드를 제공한다.
  • 동기화 선언을 하는 방법 : 메소드 선언에 synchronized 키워드를 붙인다.

 

 

'Coding > Java' 카테고리의 다른 글

[30] JAVA 컬렉션 프레임워크  (0) 2022.12.25
[29] JAVA 스레드 제어  (0) 2022.12.21
[27] JAVA 기초 복습  (0) 2022.12.14
[26] JAVA 익명 객체 (Anonymous)  (0) 2022.12.10
[25] JAVA 중첩 클래스/ 중첩 인터페이스  (0) 2022.12.09

 

과제를 수행하다 보니 자바 기초가 너무 부족한 것 같아서 다시 한번 개념 정리를 하고 넘어가려 한다.

객체란 무엇이고 클래스는 무엇이며, 필드 생성자 메소드의 역할을 다시 정리해보자.


객체지향 언어

① 객체 지향의 4대 특성

  • 캡 - 캡슐화(Encapsulation): 정보 은닉(information hiding)
  • 상 - 상속(Inheritance): 재사용
  • 추 - 추상화(Abstraction): 모델링
  • 다 - 다형성(Polymorphism): 사용 편의

※ 객체 지향 프로그래밍은 만들고자 하는 완성품인 객체를 모델링하고, 집합 관계에 있는 부품 객체와 사용 관계에 있는 객체를 하나씩 설계한 후 조립하는 방식으로 프로그램을 개발하는 기법이다.

 

② 클래스의 정의 

  • 분류, 집합. 같은 속성과 기능을 가진 객체를 총칭하는 개념
  • 자바에서는 설계도가 클래스이다.
  • 클래스에는 객체를 생성하기 위한 필드와 메소드가 정의되어 있다.
  • 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스라고 한다.

 

③ 객체의 정의 : 세상에 존재하는 유일무이한 사물

-> 세상에 존재하는 유일 무이한 객체를 특성(속성+기능)에 따라 분류해 보니 객체를 통칭할 수 있는 집합적 개념, 클래스(분류)가 나오게 된다.

 

④ 추상화 : 구체적인 것을 분해해서 관심 영역(애플리케이션 경계 Application Boundary)에 있는 특성만 가지고 재조합하는 것 = 모델링

  • OOP의 추상화는 모델링이다.
  • 클래스 : 객체 = 사람 : 김연아 = 펭귄 : 뽀로로
  • 클래스 설계에서 추상화가 사용된다.
  • 클래스 설계를 위해서는 애플리케이션 경계부터 정해야 한다.
  • 객체 지향에서 추상화의 결과는 클래스이다.

더 확장해서 추상화를 본다면 다음과 같이 볼 수 있다.

  • 상속을 통한 추상화, 구체화
  • 인터페이스를 통한 추상화
  • 다형성을 통한 추상화

 

⑤ 클래스의 구성 멤버

 

1. 필드 : 객체의 속성을 의미한다.

  • 객체의 고유 데이터, 부품 객체, 상태 정보를 저장하는 곳
  • 선언 형태는 변수와 비슷하지만, 필드를 변수라고 하지 않는다.
  • 변수는 생성자와 메소드 내에서만 사용되고 생성자와 메소드가 실행 종료되면 자동 소멸되지만 필드의 경우 생성자와 메소드 전체에서 사용되며 객체가 소멸되지 않는 한 객체외 함께 존재한다.

 

2. 생성자 : 객체 생성 시 초기화 담당

  • 생성자는 new 연산자로 호출되는 특별한 중괄호{} 블록이다.
  • 필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비를 한다.
  • 생성자는 메소드와 비슷하게 생겼지만 클래스 이름으로 되어 있고 리턴 타입이 없다.

 

3. 메서드 : 객체의 동작을 의미한다.

  • 메소드를 호출하게 되면 중괄호 블록에 있는 모든 코드들이 일괄적으로 실행된다.
  • 메소드는 필드를 읽고 수정하는 역할도 하지만, 다른 객체를 생성해서 다양한 기능을 수행하기도 한다.
  • 메소드는 객체 간의 데이터를 전단하는 수단이다.
  • 외부로부터 매개값을 받아 실행에 이용하고, 실행 후 결과 값을 외부로 리턴할 수도 있다.

 

오버로딩 오버라이딩

객체 지향에서 다형성이라고 하면 오버라이딩(Overriding)과 오버로딩(Overloading)이라고 할 수 있다.

  • 다형성 : 사용편의성
  • 오버로딩 : 같은 메서드 이름, 다른 인자 목록으로 다수의 메서드를 중복 정의
  • 오버라이딩 : 같은 메서드 이름, 같은 인자 목록으로 상위 클래스의 메서드를 재정의

 

변수와  메모리 구조

T메모리는 스태틱 영역, 스택 영역, 힙 영역으로 구성된다.

http://www.tcpschool.com/c/c_memory_structure

  • 지역 변수스택 영역에서  일생을 보낸다. 그것도 스택 프레임 안에서 일생을 보내게 된다. 따라서 스택 프레임이 사라지면 함께 사라진다.
  • 클래스 멤버 변수스태틱 영역에서 일생을 보낸다. 스태틱 영역에 한번 자리 잡으면 JVM이 종료될 때까지 고정된(static)상태로 그 자리를 지킨다.
  • 객체 변수에서 일생을 보낸다. 객체 멤버 변수들은 객체와 함께 가비지 컬렉터라고 하는 힙 메모리 회수기에 의해 일생을 마치게 된다.

전역변수 사용을 지양하는 이유

  • 전역 변수는 코드 어느 곳에서나 접근할 수 있다고 해서 전역 변수라고 하고, 여러 메서드들이 공유해서 사용한다고 해서 공유 변수라고도 한다.
  • 프로젝트 큐모에 따라 모드가 커지면서 여러 메서드에서 전역 변수의 값을 변경하기 시작하면 T메모리로 추적하지 않는 이상 전역 변수에 저장돼 있는 값을 파악하기 쉽지 않다.
  • 따라서 최대한 전역 변수는 피할 수 있다면 피해야할 존재이다.
  • 대신 잃기 전용으로 값을 공유해서 전역 상수로 쓰는 것은 좋은 방법이다. 대표적인 예로 원주율을 나타내는 PI가 있다.

참고 자료 :

 

<스프링 입문을 위한 자바 객체 지향의 원리와 이해> 김종민 지음

<혼자 공부하는 자바> 신용권 지음

'Coding > Java' 카테고리의 다른 글

[29] JAVA 스레드 제어  (0) 2022.12.21
[28] JAVA 멀티스레드  (0) 2022.12.21
[26] JAVA 익명 객체 (Anonymous)  (0) 2022.12.10
[25] JAVA 중첩 클래스/ 중첩 인터페이스  (0) 2022.12.09
[24] JAVA 타입 변환과 다형성  (0) 2022.12.06

익명 객체란 ? 

익명 객체는 이름이 없는 객체를 말한다. 무명객체라고도 한다.

  • 사용 목적 : UI 이벤트 처리 객체 / 스레드 객체를 간편하게 생성하기 위해 많이 활용
  • 사용 용도 : 필드 / 로컬변수 의 초기값, 매개변수의 매개값으로 사용
  • 사용 조건 : 단독으로 생성 불가, 클래스 상속 or 인터페이스 구현해서 사용 가능 !
  • 재사용 목적이 아닌 1번만 사용 하려고 할 때 쓴다.

 

익명 자식 객체 생성

 

  • 부모 타입으로 필드나 변수를 선언하고, 자식 객체를 초기값으로 대입할 경우
  • 우선 부모 클래스를 상속해서 자식 클래스를 선언하고,
  • new 연산자를 이용해서 자식 객체를 생성한 후,
  • 필드나 로컬 변수에 대입하는 것이 기본이다.
class Child extends Parent { } // 자식 클래스 선언

class A
{
    Parent field = new Child(); // 필드에 자식 객체를 대입
    void method()
    {
    	Parent localVar = new Child(); // 로컬 변수에 자식 객체를 대입
    }
}

 

그러나 자식 클래스가 재사용되지 않고, 오로지 해당 필드와 변수의 초기값으로만 사용할 경우라면 익명 자식 객체를 생성해서 초기값으로 대입하는 것이 좋은 방법이다.

익명 자식 객체를 생성하는 방법을 다음과 같다. 주의할 점은 하나의 실행문이므로 끝에는 세미콜론(;)을 반드시 붙여야 한다.

 

Class A
{
    Parent field = new Parent()
    {
    	int childField;
        void childMethod() {}
        @Override
        void parentMethod() {}
    };
}

 

  • 아래 예제의 경우 부모클래스인 Parent를 상속해서 중괄호 { }; 와 같이 자식 클래스를 선언하라는 뜻
  • new 연산자는 이렇게 선언된 자식클래스를 객체로 생성한다.
  • 일반 클래스와의 차이점은 생성자를 선언할 수 없다는 것이다.
  • 메소드 내에서 로컬 변수를 선언할 때 초기값으로 익명 자식 객체를 생성해서 대입할 수도 있다.
  • 또한 메소드의 매개 변수가 부모 타입일 경우 메소드 호출 코드에서 익명 자식 객체를 생성해서 매개값으로 대입할 수도 있다.

 

public class B
{
	void method1(Parent parent) {}
	void method2()
	{
		method1(
		    new Parent()
		    {
		    	int childField;
		        void childMethod() {}
		        @Override
		        void parentMethod() {}
		    }
		);		
	}
}

 

  • 익명 자식 객체에 새롭게 정의된 필드와 메소드는 익명 자식 객체 내부에서만 사용되고, 외부에서는 필드와 메소드에 접근할 수 없다.
  • 왜냐하면 익명 자식 객체는 부모 타입 변수에 대입되므로 부모 타입에 선언된 것만 사용할 수 있기 때문이다.

 

익명 구현 객체 생성

 

 

  • 인터페이스(interface)에서 구현클래스를 명시적으로 선언하고 사용하는 이유는 재사용성이 높기 때문이다.
  • 그러나 쿠현 클래스가 재사용되지 않는다면 익명 구현 객체를 생성해서 사용하는 것이 인적 자원을 줄이는 좋은 방법이다.
  • 사용 예시는 아래를 참고 ! 

 

public class Button {
	
	OnClickListener listener;
	
	// 매개 변수의 다형성
	void setOnClickListener(OnClickListener listener)
	{
		this.listener = listener;
	}
	
	// 구현 객체의 onClock() 메소드 호출
	void touch()
	{
		listener.onClick();
	}
	
	// Nested interface
	interface OnClickListener
	{
		void onClick();
	}
	
}
public class Window {

	Button button1 = new Button();
	Button button2 = new Button();
	
	// 필드 초기값으로 대입
	Button.OnClickListener listener = new Button.OnClickListener() {
		
		@Override
		public void onClick() {
			System.out.println("전화를 겁니다.");
		}
	};
	
	Window() {
		button1.setOnClickListener(listener);
		button2.setOnClickListener(new Button.OnClickListener() {
			
			@Override
			public void onClick() {
				System.out.println("메세지를 보냅니다.");
			}
		});
	}
	
}
public class Main {

	public static void main(String[] args) {
		Window w = new Window();
		w.button1.touch();
		w.button2.touch();
	}
}

실행 결과는 아래와 같다.

 

 

 

 

익명 객체의 로컬 변수 사용

  • 익명 객체 내부에서는 바깥 클래스의 필드나 메소드는 제한 없이 사용할 수 있다.
  • 문제는 메소드의 매개 변수나 로컬 변수를 익명 개체에서 사용할 때이다.
  • 메소드 내에서 생성된 익명 객체는 메소드 실행이 끝나도 힙 메모리에 존재해서 계속 사용할 수 있다.
  • 매개 변수나 로컬 변수는 메소드 실행이 끝나면 스택 메모리에서 사라지기 때문에 익명 객체에서 사용할 수 없게 되므로 문제가 발생한다.
  • 이 문제에 대한 해결 방법은 로컬클래스의 사용제한과 비슷하다. (final 키워드 관련)
  • 익명 클래스의 내부 복사 위치에 신경 쓸 필요 없이 익명 객체에서 사용된 매개 변수와 로컬 변수는 모두 final 특성을 갖는다.

'Coding > Java' 카테고리의 다른 글

[28] JAVA 멀티스레드  (0) 2022.12.21
[27] JAVA 기초 복습  (0) 2022.12.14
[25] JAVA 중첩 클래스/ 중첩 인터페이스  (0) 2022.12.09
[24] JAVA 타입 변환과 다형성  (0) 2022.12.06
[23] JAVA 인터페이스  (0) 2022.12.04

중첩 클래스

    중첩클래스란(nested)?

  • 클래스 내부에 선언한 클래스를 의미한다.
  • 중첩 클래스를 사용하여 외부에 불필요한 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다.
  • 내부에 선언되는 위치에 따라 멤버 클래스로컬 클래스 두가지로 분류된다.

 

인스턴스 멤버 클래스

  • static 키워드 없이 중첩 선언된 클래스
  • 인스턴스 필드와 메소드만 선언이 가능하고 정적 필드와 메소드는 선언할 수 없다.
  • 바깥클래스 외부에서 인스턴스 멤버 클래스의 객체를 생성하려면 먼저 바깥 클래스의 객체를 생성하고 다음에 인스턴스 멤버 클래스의 객체를 생성할 수 있다.

② 정적 멤버 클래스

  • static 키워드로 선언된 클래스
  • 바깥클래스 외부에서 정적 멤버 클래스 객체를 생성할 때 바깥클래스 객체를 먼저 생성할 필요 없이 생성이 가능하다.

③ 로컬 클래스

  • 메소드 내에 선언된 클래스이다.
  • 메소드 내부에서만 사용되므로 접근을 제한할 필요가 없기 때문에 접근 제한자 및 static을 붙이지 않는다.
  • 로컬 클래스 내부에는 인스턴스 필드와 메소드만 선언할 수 있고, 정적 필드와 메소드는 선언할 수 없다.
  • 로컬 클래스 메소드가 실행될 때 메소드 내에서 객체를 생성하고 사용해야 한다.

 

중첩 클래스의 접근 제한

① 바깥 필드와 메소드에서 사용 제한

  • 바깥 클래스에서 인스턴스 멤버를 사용할 때 제한이 있다.
  • 인스턴스 멤버 클래스는 바깥 클래스의 인스턴스 필드의 초기값이나 인스턴스 메소드에서 객체를 생성할 수 있으나
  • 정적 필드의 초기값이나 정적 메소드에서는 객체를 생성할 수 없다.
  • 반면 정적 멤버 클래스는 모든 필드의 초기값이나 모든 메소드에서 객체를 생성할 수 있다.

② 멤버 클래스에서 사용 제한

  • 인스턴스 멤버 클래스 안에서는 바깥 클래스의 모든 필드와 모든 메소드에 접근할 수 있지만
  • 정적 멤버 클래스 안에서는 바깥 클래스의 정적 필드와 메소드에만 접근할 수 있고 인스턴스 필드와 메소드에는 접근할 수 없다.

③ 로컬 클래스에서 사용 제한

  • 메소드의 매개 변수나 로컬 변수를 로컬 클래스에서 사용할 때 제한이 있다.
  • 로컬 클래스의 객체는 메소드의 실행이 종료되면 없어지는 것이 일반적 이지만, 로컬 스레드 객체를 사용할 때는 메소드가 종료되어도 계속 실행 상태로 존재할 수 있다.
  • 자바는 이 문제를 해결하기 위해 매개 변수나 로컬 변수를 로컬 클래스에서 사용할 때 final로 자동 선언한다.

④ 중첩 클래스에서 바깥 클래스 참조 얻기

  • 중첩 클래스에서 this키워드를 사용하면 바깥 클래스의 객체 참조가 아니라 중첩 클래스의 객체 참조가 된다.
  • 따라서 중첩 클래스 내부에서 바깥 클래스의 필드와 메소드를 접근하기 위해 다음과 같은 형식을 사용한다.
    • 바깥클래스.this.필드
    • 바깥클래스.this.메소드();

 

중첩 인터페이스

  • 클래스의 멤버로 선언된 인터페이스를 의미한다.
  • 클래스 내부에 선언되어 해당 클래스와 긴밀한 관계를 맺는 구현 클래스를 만드는 역할이다.
  • 인스턴스 멤버 인터페이스와 정적(static) 멤버 인터페이스 모두 가능하다.
  • 주로 정적 멤버 인터페이스를 많이 사용하는데, UI 프로그래밍에서 이벤트를 처리할 목적으로 많이 활용 된다.

 

 

https://programmerbay.com/what-are-inner-class-nested-class-and-static-nested-class-in-java/

 

 

참고자료 : https://butter-shower.tistory.com/86

'Coding > Java' 카테고리의 다른 글

[27] JAVA 기초 복습  (0) 2022.12.14
[26] JAVA 익명 객체 (Anonymous)  (0) 2022.12.10
[24] JAVA 타입 변환과 다형성  (0) 2022.12.06
[23] JAVA 인터페이스  (0) 2022.12.04
[22] JAVA 추상클래스  (0) 2022.12.03
  • 인터페이스의 다형성 : 프로그램 소스 코드는 변함이 없는데, 구현 객체를 교환함으로써 프로그램의 실행결과가 다양해 지는 것
  • 상속은 같은 종류의 하위 클래스를 만드는 기술이고 인터페이스는 사용 방법이 동일한 클래스를 만드는 기술이라는 차이가 있다.
  • 다형성을 구현하는 방법은 비슷하다.

 

자동 타입 변환(Promotion)

  • 자동 타입 변환 : 구현 객체가 인터페이스 변수에 대입되는 것
  • 필드와 매개변수 타입을 인터페이스로 선언하면 다양한 구현 객체를 대입해서 실행결과를 다양하게 만들 수 있다.
  • 인터페이스 변수 = 구현객체;

 

https://hyuntaekhong.github.io/blog/java-basic21/

 

 

다형성

 

https://cloudstudying.kr/lectures/267

 

① 필드의 다형성 : 필드 타입으로 인터페이스를 선언하면 필드값으로 다양한 객체를 대입할 수 있고, 이 객체마다 선언되어 있는 다양한 메소드를 호출할 수 있다. 따라서 기존 클래스의 메소드를 수정하지 않아도, 다양한 메소드의 실행결과를 얻을 수 있게 된다.

 

② 매개 변수의 다형성 : 매개 변수를 인터페이스 타입으로 선언하고 호출할 때에는 구현 객체를 대입한다. 매개 변수의 타입이 인터페이스일 경우 어떠한 구현 객체도 매개값으로 사용할 수 있고, 어떤 구현 객체가 제공되느냐에 따라 메소드의 실행결과는 다양해질 수 있다.

 

 

강제 타입 변환(Casting)

  • 구현 객체가 인터페이스 타입으로 자동 타입 변환하면, 인터페이스에 선언된 메소드만 사용 가능 하다는 제약이 있다.
  • 경우에 따라 구현 클래스에 선언된 필드와 메소드를 사용해야할 경우 강제 타입 변환을 사용한다.
  • 구현클래스 변수 = (구현클래스) 인터페이스 변수;

 

객체 타입 확인

  • 어떤 구현 객체가 인터페이스 타입으로 변환되었는지 확인하는 방법이다.
  • 상속과 마찬가지로 instatnceof 연산자를 사용한다.
  • 구현 객체가 인터페이스 타입으로 변환되어 있는 상태에서 가능하다.
  • 상속에서는 자식 클래스 타입인지, 인터페이스에서는 구현 클래스 타입인지를 확인할 때 사용한다.
  • 어떤 구현 객체가 변환되어 있는지 알 수 없는 상태에서 무작정 강제 타입 변환할 경우 ClassCastException이 발생할 수 있다.
  • 따라서 강제 타입 변환을 해야하는 경우 반드시 매개값이 어떤 객체인지 확인하고 안전하게 변환해야 한다.

 

인터페이스 상속

  • 인터페이스도 다른 인터페이스를 상속할 수 있다.
  • 다중 상속을 허용하지 않는 클래스와는 달리 다중 상속을 허용 한다. 즉, extends 뒤에 상위 인터페이스가 올 수 있다.
  • 하위 인터페이스를 구현하는 클래스는 하위 인터페이스의 메소드뿐만 아니라 상위 인터페이스의 모든 추상 메소드에 대한 실체 메소드를 가지고 있어야 한다.
  • 하위 인터페이스로 타입 변환이 되면 상위 및 하위 인터페이스에 선언된 모든 메소드를 사용할 수 있지만 상위 인터페이스로 타입 변환되면 상위 인터페이스에 선언되 메소드만 사용할 수 있다.

 

인터페이스 vs 클래스

 

https://www.geeksforgeeks.org/interfaces-in-java/?ref=gcse

 

 


참고자료:

https://cloudstudying.kr/lectures/267

 

15 인터페이스 | CloudStudying

# 인터페이스(interface) ## 들어가며 --- 홍팍이는 개발자다. 동시에 강사이며, 친구이다. 상황에 따라 다양한 역할을 수행한다. ![클라우드스터딩-자바-인터페이스-다형성](https://i.imgur.com/n8DKfTJ.png)

cloudstudying.kr

https://www.geeksforgeeks.org/interfaces-in-java/?ref=gcse

https://hyuntaekhong.github.io/blog/java-basic21/

https://velog.io/@mmy789/Java-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-4

'Coding > Java' 카테고리의 다른 글

[26] JAVA 익명 객체 (Anonymous)  (0) 2022.12.10
[25] JAVA 중첩 클래스/ 중첩 인터페이스  (0) 2022.12.09
[23] JAVA 인터페이스  (0) 2022.12.04
[22] JAVA 추상클래스  (0) 2022.12.03
[21] JAVA 타입변환과 다형성  (1) 2022.12.02

+ Recent posts