반응형

 

 

 

 

# 인터페이스(interface)란?


자식 클래스가 여러 부모 클래스를 상속받을 수 있다면, 다양한 동작을 수행할 수 있다는 장점을 가지게 될 것입니다.

하지만 클래스를 이용하여 다중 상속을 할 경우 메소드 출처의 모호성 등 여러 가지 문제가 발생할 수 있어 자바에서는 클래스를 통한 다중 상속은 지원하지 않습니다.

 

하지만 다중 상속의 이점을 버릴 수는 없기에 자바에서는 인터페이스라는 것을 통해 다중 상속을 지원하고 있습니다.

인터페이스(interface)란 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스를 의미합니다.

 

자바에서 추상 클래스는 추상 메소드뿐만 아니라 생성자, 필드, 일반 메소드도 포함할 수 있습니다.

하지만 인터페이스(interface)는 오로지 추상 메소드와 상수만을 포함할 수 있습니다.

 

 

# 인터페이스의 선언


자바에서 인터페이스를 선언하는 방법은 클래스를 작성하는 방법과 같습니다.

인터페이스를 선언할 때에는 접근 제어자와 함께 interface 키워드를 사용하면 됩니다.

 

자바에서 인터페이스는 다음과 같이 선언합니다.

접근제어자 interface 인터페이스이름 {

    public static final 타입 상수이름 = 값;

    ...

    public abstract 메소드이름(매개변수목록);

    ...

}

 

단, 클래스와는 달리 인터페이스의 모든 필드는 public static final이어야 하며, 모든 메소드는 public abstract이어야 합니다.

이 부분은 모든 인터페이스에 공통으로 적용되는 부분이므로 이 제어자는 생략할 수 있습니다.

이렇게 생략된 제어자는 컴파일 시 자바 컴파일러가 자동으로 추가해 줍니다.

 

 

# 인터페이스의 구현


인터페이스는 추상 클래스와 마찬가지로 자신이 직접 인스턴스를 생성할 수는 없습니다.

따라서 인터페이스가 포함하고 있는 추상 메소드를 구현해 줄 클래스를 작성해야만 합니다.

 

자바에서 인터페이스는 다음과 같은 문법을 통해 구현합니다.

class 클래스이름 implements 인터페이스이름 { ... }

 

만약 모든 추상 메소드를 구현하지 않는다면, abstract 키워드를 사용하여 추상 클래스로 선언해야 합니다.

 

다음 예제는 인터페이스를 구현하는 예제입니다.

interface Animal { public abstract void cry(); }

 

class Cat implements Animal {

    public void cry() {

        System.out.println("냐옹냐옹!");

    }

}

 

class Dog implements Animal {

    public void cry() {

        System.out.println("멍멍!");

    }

}

 

public class Polymorphism03 {

    public static void main(String[] args) {

        Cat c = new Cat();

        Dog d = new Dog();

 

        c.cry();

        d.cry();

    }

}

 

실행 결과

냐옹냐옹!

멍멍!

 

자바에서는 다음과 같이 상속과 구현을 동시에 할 수 있습니다.

class 클래스이름 extend 상위클래스이름 implements 인터페이스이름 { ... }

 

인터페이스는 인터페이스로부터만 상속을 받을 수 있으며, 여러 인터페이스를 상속받을 수 있습니다.

 

다음 예제는 인터페이스를 사용한 다중 상속의 예제입니다.

interface Animal { public abstract void cry(); }

interface Pet { public abstract void play(); }

 

class Cat implements Animal, Pet {

    public void cry() {

        System.out.println("냐옹냐옹!");

    }

    public void play() {

        System.out.println("쥐 잡기 놀이하자~!");

    }

}

 

class Dog implements Animal, Pet {

    public void cry() {

        System.out.println("멍멍!");

    }

    public void play() {

        System.out.println("산책가자~!");

    }

}

 

public class Polymorphism04 {

    public static void main(String[] args) {

        Cat c = new Cat();

        Dog d = new Dog();

 

        c.cry();

        c.play();

        d.cry();

        d.play();

    }

}

 

실행 결과

냐옹냐옹!

나비야~ 쥐 잡기 놀이하자~!

멍멍!

바둑아~ 산책가자~!

 

위의 예제에서 Cat 클래스와 Dog 클래스는 각각 Animal과 Pet이라는 두 개의 인터페이스를 동시에 구현하고 있습니다.

 

 

# 클래스를 이용한 다중 상속의 문제점


클래스를 이용하여 다중 상속을 하면 다음 예제와 같은 메소드 출처의 모호성 등의 문제가 발생할 수 있습니다.

 

예제

class Animal { 

    public void cry() {

        System.out.println("짖기!");

    }

}

 

class Cat extends Animal {

    public void cry() {

        System.out.println("냐옹냐옹!");

    }

}

 

class Dog extends Animal {

    public void cry() {

        System.out.println("멍멍!");

    }

}

 

 class MyPet extends Cat, Dog {}

 

public class Polymorphism {

    public static void main(String[] args) {

        MyPet p = new MyPet();

      p.cry();

    }

}

 

위의 예제에서 Cat 클래스와 Dog 클래스는 각각 Animal 클래스를 상속받아 cry() 메소드를 오버라이딩하고 있습니다.

여기까지는 문제가 없지만, ①번 라인에서 MyPet 클래스가 Cat 클래스와 Dog 클래스를 동시에 상속받게 되면 문제가 발생합니다.

②번 라인에서 MyPet 인스턴스인 p가 cry() 메소드를 호출하면, 이 메소드가 Cat 클래스에서 상속받은 cry() 메소드인지 Dog 클래스에서 상속받은 cry() 메소드인지를 구분할 수 없는 모호성을 지니게 됩니다.

이와 같은 이유로 자바에서는 클래스를 이용한 다중 상속을 지원하지 않는 것입니다.

 

하지만 다음 예제처럼 인터페이스를 이용하여 다중 상속을 하게되면, 위와 같은 메소드 호출의 모호성을 방지할 수 있습니다.

interface Animal { public abstract void cry(); }

 

interface Cat extends Animal { public abstract void cry(); }

interface Dog extends Animal { public abstract void cry(); }

 

class MyPet implements Cat, Dog {

    public void cry() {

        System.out.println("멍멍! 냐옹냐옹!");

    }

}

 

public class Polymorphism05 {

    public static void main(String[] args) {

        MyPet p = new MyPet();

        p.cry();

    }

}

실행 결과

멍멍! 냐옹냐옹!

 

위의 예제에서는 Cat 인터페이스와 Dog 인터페이스를 동시에 구현한 MyPet 클래스에서만 cry() 메소드를 정의하므로, 앞선 예제에서 발생한 메소드 호출의 모호성이 없습니다.

 

# 인터페이스의 장점


인터페이스를 사용하면 다중 상속이 가능할 뿐만 아니라 다음과 같은 장점을 가질 수 있습니다.

 

1. 대규모 프로젝트 개발 시 일관되고 정형화된 개발을 위한 표준화가 가능합니다.

2. 클래스의 작성과 인터페이스의 구현을 동시에 진행할 수 있으므로, 개발 시간을 단축할 수 있습니다.

3. 클래스와 클래스 간의 관계를 인터페이스로 연결하면, 클래스마다 독립적인 프로그래밍이 가능합니다.

 

 

 

# 출처


TCPSchool.com https://tcpschool.com/java/java_polymorphism_interface

 

반응형

'Programming > JAVA' 카테고리의 다른 글

Call by value, Call by reference  (0) 2021.11.23
쓰레드, GC, 쿠키와 세션, Anomaly  (0) 2021.11.23
더 알아볼 개념들  (0) 2021.11.15
클래스, 객체, 메소드  (0) 2021.11.15
자바 Study Overview  (0) 2021.11.15
반응형

 

 

클래스란?


객체(object)를 만드는 기능

클래스에 의해서 만들어진 객체를 인스턴스

 

 

객체 변수 (Instance variable)


클래스에 선언된 변수를 객체 변수 라고 부른다. 또는 인스턴스 변수, 멤버 변수, 속성이라고도 말한다.

도트연산자(.)를 이용하여 접근할 수 있다.

 

 

메소드


메소드는 클래스 내에 구현된 함수를 의미하는데 보통 함수라고 말하지 않고 메소드라고 말한다.

객체 변수는 공유되지 않는다

객체 지향적(Object Oriented)이라는 말의 의미도 곱씹어 보면 결국 이 객체 변수의 값이 독립적으로 유지되기 때문에 가능한 것이다.

(참고. 객체 변수의 값은 공유되지 않지만 나중에 알게될 static을 이용하게 되면 객체 변수를 공유하도록 만들 수도 있다.)

 

 

 

출처


점프 투 자바 https://wikidocs.net/214

반응형

'Programming > JAVA' 카테고리의 다른 글

Call by value, Call by reference  (0) 2021.11.23
쓰레드, GC, 쿠키와 세션, Anomaly  (0) 2021.11.23
더 알아볼 개념들  (0) 2021.11.15
인터페이스(interface)  (0) 2021.11.15
자바 Study Overview  (0) 2021.11.15
반응형

 

 

# 객체지향에 대해 설명해보세요


: 캡상추다(캡슐화 / 상속 / 추상화 / 다형성)으로 코드의 재사용성을 높이고 코드의 관리가 용이하고 제어자와 메서드를 이용하여 데이터를 보호하는데 좋으며 코드의 중복을 제거하여 코드의 불일치로 인한 오류를 방지할 수 있다. (클래스 = 설계도 / 객체 = 제품) ex_ TV설계도&TV, 붕어빵 기계 & 붕어빵

* 캡슐화 : 데이터 보호 / 불필요한 부분을 감출 수 있다. (접근 제어자 / 인터페이스 등)

* 상속 : 기존의 클래스를 재사용해서 새로운 클래스를 작성하는 것 (class 자손클래스 extends 조상클래스 {...})

* 추상화 : 추상클래스 / 추상메서드 / 인터페이스를 예로 설명

* 다형성 : 하나의 참조변수로 여러 타입의 객체를 참조할 수 있는 것 ( 조상타입의 참조변수로 자손타입의 개체를 다룰 수 있는 것 )

 

# 오버로딩 & 오버라이딩 차이는?


: 오버로딩은 하나의 클래스에 같은 이름의 메서드를 여러 개 정의하는 것을 말하며

: 오버라이딩은 조상클래스로부터 상속받은 메서드의 내용을 상속받는 클래스에 맞게 변경하는 것을 말한다.

 

* 오버로딩 조건

ⓐ 메서드의 이름이 같아야 한다.

ⓑ 매개변수의 개수 or 타입이 달라야 한다. (리턴타입은 오버로딩 구현과 관계 없다)

* 오버라이딩(조상에게 받은 메서드의 구현부를 바꿈) 조건

ⓐ 선언부가 같아야 한다(이름 / 매개변수 / 리턴타입)

ⓑ 접근제어자를 좁은 범위로 변경할 수 없다.

ⓒ 조상클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.

# 접근 제어자 : 멤버 or 클래스에 사용되어, 외부로부터의 접근을 제한

(클래스 / 멤버변수 / 메서드 / 생성자)


private : 같은 클래스 내에서만 접근 가능

default : 같은 패키지 내에서만

protected : 같은 패키지 & 다른 패키지의 자손클래스에서 접근 가능

public : 접근 제한이 전혀 없음

# 클래스 / 추상클래스 / 인터페이스 차이


: 클래스가 설계도라면 추상클래스는 미완성 설계도이며 인터페이스는 밑그림 정도로 생각하면 된다.

클래스의 경우 속성과 기능들로 완성된 설계도이기 때문에 인스턴스를 만들 수 있지만 추상클래스와 인터페이스의 경우 미완성이기 때문에 인스턴스를 생성할 수 없다.

추상클래스는 미완성 메서드를 포함하지만 인터페이스는 선언부만 있는 메서드와 상수만을 가질 수 있으며 클래스를 작성하는데 도움을 줄 목적으로 사용된다.

인터페이스 추가 설명으로는 관계없는 클래스 간 관계를 맺어주고 표준화를 시키며 개인작업이 가능하게 해줘 프로그래밍의 시간을 단축시킬 수 있다.

( class 클래스명 / abstract class 클래스명 / interface 인터페이스명 )

* 인터페이스의 경우 상속이 가능하며 다중상속까지 가능하다.

# 컬렉션(데이터 그룹을 의미) 프레임워크 핵심 인터페이스


List : 순서 O / 중복 O (ArrayList / LinkedList / Stack / Vector 등)

Set : 순서 X / 중복 X (HashSet / TreeSet 등)

Map : (key, value)로 이루어짐. key 중복 X / value 중복 O (HashMap / TreeMap 등)

* 컬렉션과 배열의 차이 : 배열은 하나의 타입만 저장이 가능하고, 컬렉션은 다양한 타입의 저장이 가능하다. 또한 배열은 고정된 크기이며, 컬렉션은 가변적 크기이다.

# 프로세스 / 쓰레드 (프로세스 : 쓰레드 = 공장 : 일꾼)


프로세스 : 실행 중인 프로그램. 자원(resources)과 쓰레드로 구성

쓰레드 : 프로세스 내에서 실제 작업을 수행하는 단위. 모든 프로세스는 하나의 쓰레드를 가지고 있다.

멀티쓰레드 : 하나의 프로세스에 하나 이상의 쓰레드를 생성하여 실행

# 싱글톤 패턴이란?


: 애플리케이션이 시작될 때 어떤 클래스가 최초 한 번만 메모리를 할당하고(static) 그 메모리의 인스턴스를 만들어 사용하는 패턴.

(인스턴스가 필요한 경우 똑같은 인스턴스를 여러 개 만드는 것이 아니라, 동일(기존) 인스턴스를 사용하게 한다)

* 장점

ⓐ 고정된 메모리 사용으로 new 인스턴스를 사용하기 때문에 메모리 낭비를 막음

static(전역) 인스턴스이기 때문에 다른 클래스에서 데이터를 공유하기 쉬움

* 단점 : 너무 많은 사용은 다른 클래스들 간의 결합도가 높아져 수정, 테스트가 어려워질 수 있다.

 

 

기본

  • Java 접근 제어자에 대해서 각각 설명해 주세요.
  • JVM의 구조에 대해서 설명해 주세요.
  • Garbage Collector 에 대해서 설명해 주세요. 어떻게 동작하나요?
  • GC의 종류에 대해서 말해보세요.
  • Java 버전 별 특성에 대해서 아는대로 말해주세요.
  • Java는 Call By Value일까요, Call By Reference 일까요?
  • 리플렉션(Reflection)이란 무엇인가요?
  • Stream API란 무엇인가요?
  • Lambda란 무엇인가요?
  • 함수형 인터페이스란 무엇인가요?
  • JVM 기동시 주로 사용되는 옵션들을 아는대로 말해보세요.
  • foreach를 사용할 수 있는 자료구조는 어떤 인터페이스를 상속받고 있나요?
  • iterator와 iterable 차이는 무엇인가요?
  • synchronized 키워드에 대해 설명해 주세요.
  • volatile 키워드에 대해 설명해 주세요.
  • final 키워드에 대해서 설명해주세요. 각각의 쓰임에 따라 어떻게 동작하나요?

클래스와 객체

  • Wrapper Class란 무엇인가요?
  • 클래스, 객체, 인스턴스 차이에 대해서 설명해 주세요.
  • 직렬화(Serialization)과 역직렬화(Deserialization)에 대해서 설명해 주세요.
  • Java Generic에 대해서 설명해 주세요.
  • equals와 ==의 차이는 무엇인가요?
  • hashCode란 무엇인가요?
  • 문자열을 리터럴(string = "abcd")로 할당하는 것과 객체(string = new String("abcd"))로 할당하는 방식의 차이가 무엇인가요?
  • 순수 추상 클래스와 인터페이스의 차이는 무엇인가요?
  • 본인 관점에서, 인터페이스는 주로 어떨 때 사용하나요?

자료형, 자료구조

  • Java의 Collection에 대해서 설명해 주세요.
  • Array와 ArrayList의 차이점은 무엇인가요?
  • char type과 string type으로 나뉘어져 있는 이유는 무엇인가요?

 

# 출처


[출처] 기술 면접 질문 모음|작성자 hygoogi

반응형

'Programming > JAVA' 카테고리의 다른 글

Call by value, Call by reference  (0) 2021.11.23
쓰레드, GC, 쿠키와 세션, Anomaly  (0) 2021.11.23
더 알아볼 개념들  (0) 2021.11.15
인터페이스(interface)  (0) 2021.11.15
클래스, 객체, 메소드  (0) 2021.11.15

+ Recent posts