Q1. 자바 데이터 타입 중 기본형과 참조형의 차이에 대해 설명해주세요.
기본적으로 JAVA는 기본형 타입과 참조형 타입 2종류가 존재합니다.
기본형 타입
그리고, 기본형 타입을 다시 4타입으로 나눌 수 있습니다.
- 정수형 타입 : byte(1byte), short(2byte), int(4byte), long(8byte)
- 실수형 타입 : float(4byte), double(8byte)
- 문자형 타입 : char(2byte)
- 논리 타입: boolean(1byte)
참조형 타입
참조형 타입은 위의 기본형 타입 뺀 모든 형태(type)를 참조형 타입으로 볼 수 있습니다.
기본형 빼고 다라니 너무한가요?
다들 아시다시피, 우리가 코드를 짤 때 기본형 이외에 수 많은 변수형태들을 만들어내기 때문에 딱 국한지어 말을 할 수 없다고 생각합니다.
그래도 크게 범주를 나눠본다면
- 배열(array[])
- 열거(enum)
- 클래스(class)
- 인터페이스(interface)
기본형과 참조형의 차이점
- 기본형
-기본형 변수 안에는 직접 값들을 넣을 수 있습니다.
-스택 영역에 저장
- 참조형
-참조형 변수 안에는 값들을 저장하고 있는 객체를 가르키는 주소를 가지고 있습니다.
-ex) 기본형처럼 직접 값(a)를 담는 A라는 변수가 아닌, a를 가르키고 있는 주소(x1002)를 가지고 있는 변수A가 생성
-힙 영역에 저장
스택과 힙
- 스택- 기본형 타입 변수들과 그 값들이 함께 저장된다.- 힙 영역에 저장되어 있는 참조형 타입 변수들의 reference(주소)가 저장된다.- 정적인 것들이 저장되는 곳
- 힙- 참조형 타입의 변수들이 저장된다. (new연산자를 통해 생성된 인스턴스 변수가 저장된다.) - (cf. 인스턴스 변수의 reference는 스택에 저장)- 동적인 것들이 저장되는 곳
Q2. 클래스와 객체에 대해 설명해주세요.
클래스(class), 객체(object), 인스턴스(instance) 차이
클래스란 객체를 정의하고 만들어 내기 위한 설계도 혹은 틀을 말한다. 클래스 안에는 객체를 만들어내기 위해 필요한 변수와 메서드들이 존재한다.
객체란 클래스에 선언된 모양 그대로 생성된 실체를 말하며 '클래스의 인스턴스'라고 부른다.
인스턴스란 클래스를 통해서 구현해야할 대상(객체)이 실제로 구현된 구체적인 실체를 말한다.
예를들어 붕어빵을 만든다고 상황을 가정해보자. 여기서 클래스는 붕어빵을 만들기 위한 틀이 되고 객체는 붕어빵이다. 그리고 인스턴스는 붕어빵 틀로 찍어낸 각각의 붕어빵이다.
팥붕어빵과 슈크림붕어빵은 같은 타입의 객체이지만, 인스턴스 관점으로 보았을 때는 다르다.
Q3. 생성자에 대해 설명해주세요.
먼저, 생성자란?
생성자는 간단하게 얘기하면 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메소드'이다.
따라서 인스턴스 변수의 초기화 작업에 사용되고, 인스턴스 생성 시에 실행되어야 할 작업을 위해서 사용된다.
- 생성자의 이름은 클래스의 이름과 같아야 한다.
- 생성자는 리턴 값이 없다. void 또한 사용하지 않는다.
- 생성자는 몇 가지 특징을 제외하면 메소드와 다르지 않다.
- 생성자는 메소드 처럼 클래스 내에 선언되고, 오버 로딩이 가능하므로 하나의 클래스에 여러 개의 생성자가 존재할 수 있다.
Q4. 메서드 오버라이딩과 메서드 오버로딩의 차이는 무엇인가요?
1. 오버로딩(Overloading)
- 메서드의 이름은 같고 매개변수의 갯수나 타입이 다른 함수를 정의하는 것을 의미한다.
- 리턴값만을 다르게 갖는 오버로딩은 작성 할 수 없다.
2. 오버라이딩(Overriding)
- over + ride = 먼가 위에서 (라이딩 한다)달린다???
- 상위 클래스의 메서드를 하위 클래스가 재정의 하는 것이다.
- 메서드의 이름은 물론 파라메터의 갯수나 타입도 동일해야 하며, 주로 상위 클래스의 동작을 상속받은 하위 클래스에서 변경하기 위해 사용된다.
즉,
오버로딩(Overloading)은 기존에 없던 새로운 메서드를 정의하는 것이고,
오버라이딩(Overriding)은 상속 받은 메서드의 내용만 변경 하는 것이다.
구분 | 오버로딩 | 오버라이딩 |
메소드 이름 | 동일 | 동일 |
매개변수, 타입 | 다름 | 동일 |
리턴 타입 | 상관없음 | 동일 |
Q5. 자바의 메모리 영역에 대해 설명해주세요.
JVM 메모리 구조
위에서 자바 프로그램의 실행 단계를 아주 간략하게 소개하였는데, JVM의 구체적인 수행 과정은 언급하지 않았습니다. 이제부터는 JVM이 정확히 어떻게 동작을 하고 구조가 어떤지 알아 봅시다.
아래는 자바 프로그램의 실행 단계입니다. 분량상 운영체제 도형은 생략하였습니다. JVM의 구조는 크게 보면, Garbage Collector, Execution Engine, Class Loader, Runtime Data Area로, 4가지로 나눌 수 있습니다.

위에서 설명하였듯이, 자바 소스 파일은 자바 컴파일러에 의해서 바이트 코드 형태인 클래스 파일이 됩니다. 그리고 이 클래스 파일은 클래스 로더가 읽어들이면서 JVM이 수행됩니다.
(1) Class Loader
JVM 내로 클래스 파일을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈입니다. 런타임 시에 동적으로 클래스를 로드합니다.
(2) Execution Engine
클래스 로더를 통해 JVM 내의 Runtime Data Area에 배치된 바이트 코드들을 명렁어 단위로 읽어서 실행합니다. 최초 JVM이 나왔을 당시에는 인터프리터 방식이었기때문에 속도가 느리다는 단점이 있었지만 JIT 컴파일러 방식을 통해 이 점을 보완하였습니다. JIT는 바이트 코드를 어셈블러 같은 네이티브 코드로 바꿈으로써 실행이 빠르지만 역시 변환하는데 비용이 발생하였습니다. 이 같은 이유로 JVM은 모든 코드를 JIT 컴파일러 방식으로 실행하지 않고, 인터프리터 방식을 사용하다가 일정한 기준이 넘어가면 JIT 컴파일러 방식으로 실행합니다.
(3) Garbage Collector
Garbage Collector(GC)는 힙 메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체들을 탐색 후 제거하는 역할을 합니다. 이때, GC가 역할을 하는 시간은 언제인지 정확히 알 수 없습니다.
(4) Runtime Data Area
JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역입니다. 이 영역은 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack로 나눌 수 있습니다.

(1) Method area
모든 쓰레드가 공유하는 메모리 영역입니다. 메소드 영역은 클래스, 인터페이스, 메소드, 필드, Static 변수 등의 바이트 코드를 보관합니다.
2. Heap area
모든 쓰레드가 공유하며, new 키워드로 생성된 객체와 배열이 생성되는 영역입니다. 또한, 메소드 영역에 로드된 클래스만 생성이 가능하고 Garbage Collector가 참조되지 않는 메모리를 확인하고 제거하는 영역입니다.
3. Stack area

메서드 호출 시마다 각각의 스택 프레임(그 메서드만을 위한 공간)이 생성합니다. 그리고 메서드 안에서 사용되는 값들을 저장하고, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장합니다. 마지막으로, 메서드 수행이 끝나면 프레임별로 삭제합니다.
4. PC Register
쓰레드가 시작될 때 생성되며, 생성될 때마다 생성되는 공간으로 쓰레드마다 하나씩 존재합니다. 쓰레드가 어떤 부분을 무슨 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행중인 JVM 명령의 주소를 갖습니다.
5. Native method stack
자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역입니다.
Q6. static 키워드에 대해 설명하고, static를 언제 사용해야 하는 지 설명해주세요.
static 이란 무엇인가?
- static은 변수나 메소드에 키워드로 사용된다.
- static 키워드를 사용한 변수는 클래스가 메모리에 올라갈 때 자동으로 생성이 된다. 즉, 인스턴스(객체) 생성 없이 바로 사용가능 하다.
static 키워드를 사용하는 이유는?
- 자주 변하지 않는 일정한 값이나 설정 정보같은 공용자원에 대한 접근에 있어서 매번 메모리에 로딩하거나 값을 읽어들이는 것보다 일종의 '전역변수'와 같은 개념을 통해서 접근하는 것이 비용도 줄이고 효율을 높일 수있다.
- 인스턴스 생성 없이 바로 사용가능 하기 때문에 프로그램 내에서 공통으로 사용되는 데이터들을 관리 할 때 이용한다.
----------------------------------------------------------------------------------------------------------------------------
1.클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통적으로 사용해야하는 것에 static을 붙인다.
- 인스턴스를 생성하면, 각 인스턴스들은 서로 독립적기 때문에 서로 다른 값을 유지한다. 경우에 따라서는 각 인스턴스들이 공통적으로 같은 값이 유지되어야 하는 경우 static을 붙인다.
2. static이 붙은 멤버변수는 인스턴스를 생성하지 않아도 사용할 수 있다.
- static이 붙은 멤버변수(클래스변수)는 클래스가 메모리에 올라갈때 이미 자동적으로 생성되기 때문이다.
3. static이 붙은 메서드(함수)에서는 인스턴스 변수를 사용할 수 없다.
- static이 메서드는 인스턴스 생성 없이 호출가능한 반면, 인스턴스 변수는 인스턴스를 생성해야만 존재하기 때문에... static이 붙은 메서드(클래스메서드)를 호출할 때 인스턴스가 생성되어있을수도 그렇지 않을 수도 있어서 static이 붙은 메서드에서 인스턴스변수의 사용을 허용하지 않는다. (반대로, 인스턴스변수나 인스턴스메서드에서는 static이 붙은 멤버들을 사용하는 것이 언제나 가능하다. 인스턴스변수가 존재한다는 것은 static이 붙은 변수가 이미 메모리에 존재한다는 것을 의미하기 때문이다.)
4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.
- 메서드의 작업내용중에서 인스턴스 변수를 필요로 한다면, static을 붙일 수 없다. 반대로 인스턴스변수를 필요로 하지 않는다면, 가능하면 static을 붙이는 것이 좋다. 메서드 호출시간이 짧아지기 때문에 효율이 높아진다. (static을 안붙인 메서드는 실행시 호출되어야할 메서드를 찾는 과정이 추가적으로 필요하기 때문에 시간이 더 걸린다.)
5. 클래스 설계시 static의 사용지침
- 먼저 클래스의 멤버변수중 모든 인스턴스에 공통된 값을 유지해야하는 것이 있는지
살펴보고 있으면, static을 붙여준다.
- 작성한 메서드 중에서 인스턴스 변수를 사용하지 않는 메서드에 대해서 static을
붙일 것을 고려한다.
일반적으로 인스턴스변수와 관련된 작업을 하는 메서드는 인스턴스메서드(static이 안붙은 메서드)이고 static변수(클래스변수)와 관련된 작업을 하는 메서드는 클래스메서드static이 붙은 메서드)라고 보면 된다.
출처: https://vaert.tistory.com/101 [Vaert Street]
Q7. 자바 객체지향 프로그래밍(OOP)에 대해 설명해주세요.
객체지향 프로그래밍(Object-Oriented Programming)이란 프로그램을 설계하는 개념이자 방법론이다.
줄여서 OOP라 부르며, 단어 뜻 그대로 프로그램(실제세계)를 객체(사물)라는 기본 단위로 나누고 이 객체들간의 상호작용을 기본개념으로 한다.
객체지향 프로그래밍(OOP)은 프로그램을 유연하고 변경하기 쉽게 만들기 때문에 재사용성이 용이하여 대규모 프로젝트에서 많이 사용되는 방법론이다. 프로그램 개발과 유지보수가 용이하다는 점이 가장 큰 장점으로 꼽힌다.
2. 객체지향 vs 절차지향
비교 | 절차지향 언어 | 객체지향 언어 |
장점 | - 처리속도가 빠르다 - 초기 프로그래밍 언어로 컴퓨터의 처리구조와 비슷해 실행속도가 빠르다 |
- 코드 재사용성이 용이하다 - 개발(코딩)이 간단하다 - 유지보수가 쉽다 - 대규모 프로젝트에 적합하다 |
단점 |
- 유지보수가 어렵다
- 대규모 프로젝트에 부적합하다
- 프로그램 분석이 어렵다
|
- 처리속도가 느리다 - 객체에 따른 용량증가 - 설계단계에 시간이 많이 소요된다 |
객체지향의 특징 4가지(추상화, 캡슐화, 상속, 다형성)
1. 추상화(Abstraction)
객체지향에서 추상화란 객체에서 공통된 속성과 행위를 추출하는 것을 의미한다.
예를들어, 게임 프로그램을 개발하며 캐릭터가 소지하는 다양한 무기들이 있다. 칼, 삽, 곡갱이, 총, 활 등 여러가지 무기들이 존재하는데
이들의 기능적인 내용은 다르지만 공통적인 속성과 행위를 개념으로 무기라는 클래스를 정의할 수 있다.
이렇듯 추상화는 다른 객체들과 구분되는 핵심적인 부분에 집중하여, 복잡도를 관리할 수 있게 해준다.
2. 캡슐화(Encapsulation)
캡슐화는 연관있는 변수와 메소드를 묶어주는 작업을 말한다.
접근 제어 지시자[public, private, protected]를 통해 외부로부터의 접근을 제한하여 객체내에서만 접근이 가능하도록 해준며,
이를 정보은닉이라 한다.
외부의 클래스 혹은 모듈에 의존적인 프로그램의 경우 변경이나 오류에 취약해지는데, 정보은닉을 통해 이러한 결합도를 낮추며 응집도를 높여준다.
3. 상속(Inheritance)
클래스 개념이 도입되면서 상속을 통해 부모클래스의 속성과 기능을 이어받아(상속받아) 사용하는 것을 말한다.
프로그램을 개발하다보면 중복되는 속성과 기능을 개발해야하는 일이 발생되는데 상속을 사용한다면 중복되는 기능을 반복하여 작업하지 않고 작업을 할 수 있게 해준다.
- 자식클래스는 상속을 통해 부모클래스의 속성과 기능을 물려받는다.
- 또한, 다형성을 통해 변경이 필요한 부분을 변경하여 사용할 수 있다.
4. 다형성(Polymorphism)
다형성이란 프로그래밍 언어의 자료형 체계의 성질을 나타내는 것으로, 동일한 변수, 함수명 등이 다양한 방법으로 기능하는 것을 말하며
오버라이딩(Overriding), 오버로딩(Overloading)이란 형태로 제공된다.
Q8. 자바 접근 제어자의 특징과 종류에 대해서 설명해주세요.
1. 접근제어자
- 접근제어자는 멤버 또는 클래스에 사용되어 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 함
- 접근제어자는 생략가능하며 생략했을 때는 자동으로 default 임을 뜻하게 된다. 따라서 default 일경우에는 접근제어자를 지정하지 않는다.
- 접근제어자가 사용될 수 있는 곳 : 클래스, 멤버변수, 메서드, 생성자
1) private : 같은 클래스 내에서만 접근 가능
2) default : 같은 패키지 내에서만 접근 가능
3) protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근 가능
4) public : 접근 제한이 전혀 없다.
제어자 | 같은 클래스 | 같은 패키지 | 자손 클래스 | 전체 |
public | ||||
protected | ||||
default | ||||
private |
- 접근 범위 : private < default < protected < public 순으로 보다 많은 접근을 허용한다
대상 | 사용가능한 접근 제어자 |
클래스 | public, (default) |
메서드 | public, protected, (default), private |
멤버변수 | |
지역변수 | 없음 |
2. 접근 제어자를 이용한 캡슐화
- 접근 제어자를 사용하는 이유는 클래스의 내부에 선언된 데이터를 보호하기 위해서이다. 데이터가 유효한 값을 유지하도록 또는 비밀번호와 같은 데이터를 외부에서 함부로 변경하지 못하도록 하기 위해서는 외부로부터의 접근을 제한하는 것이 필요하다
- 이것을 데이터 감추기라고 하며 객체지향개념에선 캡슐화(encapsulation)이라 한다.
3. 제어자의 조합
- 대상에 따라 사용할 수 있는 제어자
대상 | 사용가능한 접근 제어자 |
클래스 | public, (default), final, abstract |
메서드 | 모든 접근제어자, final, abstract, static |
멤버변수 | 모든 접근제어자, final, static |
지역변수 | final |
- 제어자 조합해서 사용할 때 주의할 사항
1) 메서드에 static과 abstract를 함께 사용할 수 없다.
: static 메서드는 몸통이 있는 메서드에만 사용할 수 있기 때문
2) 클래스에 abstract와 final을 동시에 사용할 수 없다.
:클래스에 사용되는 final은 클래스를 확장할 수 없다는 의미이고, abstract는 상속을 통해서 완성되어야 한다는 의미이므로 서로 모순되기 때문이다.
3) abstract메서드의 접근 제어자가 private일 수 없다.
: abstract메서드는 자손클래스에서 구현하기 위해 접근해야 하기 때문이다.
4) 메서드에 private와 final을 같이 사용할 필요는 없다
: 접근 제어자가 private인 메서드는 오버라이딩될 수 없기 때문이다. 이 둘 중 하나만 사용해도 의미가 충분하다.
출처: https://88240.tistory.com/448 [shaking blog]
Q9. 추상 클래스와 인터페이스의 차이는 무엇인가요?
추상클래스와 인터페이스의 공통점 및 차이점
추상클래스(Abstract Class) | 인터페이스(Interface) | |
공통점 | 선언만 있고, 구현 내용이 없다. | |
자기 자신이 new를 통해 객체를 생성할 수 없으며 상속받은 자식만이 객체를 생성할 수 있다. | ||
상속받은 자식이 구현을 반드시 하도록 한다. | ||
차이점 | 추상클래스를 상속받아 기능을 이용하고, 확장시키기 위해 사용한다. | 구현 객체의 같은 동작을 보장하기 위해 사용한다. |
다중 상속 불가능하다. | 다중 상속 가능하다. | |
일반메서드와 추성메서드 가능하다. | 추상메서드만 가능하다 | |
일반변수 + 일반메서드 + 추상메서드 형태 | 상수 + 추상메서드 형태 | |
생성자와 일반변수 모두 가질 수 있다. | 생성자와 일반변수를 가질 수 없다. | |
extends | implements | |
메서드의 부분적인 구현 가능하다. | 메서드 선언만 가능하다. |
출처: https://haenny.tistory.com/162 [Haenny]
Q10. 이너클래스의 장점에 대해 설명해주세요.
내부 클래스(inner class)
내부 클래스(inner class)란 하나의 클래스 내부에 선언된 또 다른 클래스를 의미합니다.
이러한 내부 클래스는 외부 클래스(outer class)에 대해 두 개의 클래스가 서로 긴밀한 관계를 맺고 있을 때 선언할 수 있습니다.
class Outer { // 외부 클래스
...
class Inner { // 내부 클래스
...
}
...
}
내부 클래스의 장점
내부 클래스를 사용하면 다음과 같은 장점을 가질 수 있습니다.
1. 내부 클래스에서 외부 클래스의 멤버에 손쉽게 접근할 수 있게 됩니다.
2. 서로 관련 있는 클래스를 논리적으로 묶어서 표현함으로써, 코드의 캡슐화를 증가시킵니다.
3. 외부에서는 내부 클래스에 접근할 수 없으므로, 코드의 복잡성을 줄일 수 있습니다.
내부 클래스의 종류
내부 클래스는 필드와 마찬가지로 선언된 위치에 따라 다음과 같이 구분됩니다.
1. 정적 클래스(static class)
2. 인스턴스 클래스(instance class)
3. 지역 클래스(local class)
4. 익명 클래스(anonymous class)
외부 클래스 영역에 선언된 클래스 중에서 static 키워드를 가지는 클래스를 정적 클래스(static class)라고 합니다.
이러한 정적 클래스는 주로 외부 클래스(outer class)의 클래스 메소드에 사용될 목적으로 선언됩니다.
외부 클래스 영역에 선언된 클래스 중에서 static 키워드를 가지지 않는 클래스를 인스턴스 클래스(instance class)라고 합니다.
이러한 인스턴스 클래스는 주로 외부 클래스(outer class)의 인스턴스 변수나 인스턴스 메소드에 사용될 목적으로 선언됩니다.
지역 클래스(local class)란 외부 클래스의 메소드나 초기화 블록에 선언된 클래스를 의미합니다.
이러한 지역 클래스는 선언된 블록 내에서만 사용할 수 있습니다.
익명 클래스(anonymous class)
익명 클래스(anonymous class)란 다른 내부 클래스와는 달리 이름을 가지지 않는 클래스를 의미합니다.
익명 클래스는 클래스의 선언과 동시에 객체를 생성하므로, 단 하나의 객체만을 생성하는 일회용 클래스입니다.
따라서 생성자를 선언할 수도 없으며, 오로지 단 하나의 클래스나 단 하나의 인터페이스를 상속받거나 구현할 수 있을 뿐입니다.
이러한 익명 클래스는 매우 제한적인 용도에 사용되며, 구현해야 하는 메소드가 매우 적은 클래스를 구현할 때 사용됩니다.
자바에서 익명 클래스는 다음과 같이 선언할 수 있습니다.
// 익명 클래스는 선언과 동시에 생성하여 참조변수에 대입함.
클래스이름 참조변수이름 = new 클래스이름(){
// 메소드의 선언
};
Q11. OOP의 장점과 단점에 대해 설명해주세요.
◆ OOP(Object Oriented Programming)
- 객체지향 프로그래밍 방식
- 큰 문제를 작게 쪼개는 것이 아니라, 작은 문제들을 해결하는 객체를 만드는 방식
◆ OOP의 장점과 단점
- 장점 : 코드의 재사용성, 유지보수, 코드 간결
- 단점 : 처리시간이 비교적 오래 걸림(JMV도 거치니까), 프로그램 설계 많은 고민과 시간 투자.
◆ OOP의 4가지 특징
1. 추상화(Abstraction)
- 불필요한 정보는 숨기고, 중요한 정보만 표현하여 프로그램을 간단하게 만드는 것
(중요한 정보란? 각 객체들의 공통된 특성을 의미)
- 각 객체의 구체적인 개념보다 추상적 개념에 의존해야 설계를 유연하게 변경 가능
2. 캡슐화(Encapsulation)
- 객체의 필드, 메소드를 하나로 묶고, 실제 구현 내용을 감추는 것(캡슐처럼 묶어서 보관)
- 외부 객체는 객체 내부 구조를 알지 못하며 객체가 노출해 제공하는 필드, 메소드만 이용 가능!
- 클래스 내부 구현의 응집도를 높이고, 외부 클래스와의 결합도를 낮춤
- 목적 : 객체 내부의 무결성을 유지함으로써 보안을 유지하기 위함이다.
(무결성을 유지하기 위해 접근제한자를 사용한다!)
<접근제한자의 종류>
ex) public, private, protected, default
public : 클래스 외부에서 접근 가능
private : 클래스 내부에서만 접근 가능
protected : 상속받은 자식 클래스에서만 접근 가능
<참고> 응집도와 결합도
- 응집도(Cohesion) : 클래스나 모듈 안의 요소들이 얼마나 밀접하게 관련되어 있는지를 나타냄
- 결합도(Coupling) : 어떤 기능을 실행하는 데 다른 클래스나 모듈들에 얼마나 의존적인지를 나타냄
3. 상속성(Inheritance)
- 상위 클래스의 필드와 메소드를 물려받아 하위클래스에서 사용
- 하위클래스는 상위 객체를 확장하여 추가적인 필드와 메소드를 가질 수 있음
- 아래로 내려갈수록 구체화(specialize), 위로 갈수록 일반화(generalize)
※ 상속의 효과
- 상위 객체를 재사용해서 하위 객체를 빨리 개발 가능
- 반복된 코드의 중복을 줄임
- 유지보수의 편리성 제공
- 객체의 다형성 구현 (★★★ 상속성 - 다형성의 필수 조건이다!!)
4. 다형성(Polymorphism)
먼저, 비유를 통해 다형성에 대해 다가가보자!
부모객체(동물 - sound메소드)를 상속받는, 자식객체(강아지, 고양이)가
부모의 메소드를 상속 받았을 때 자식객체의 sound가 각각 다른 실행 결과가 나타난다.
- 하나의 메소드나 클래스가 다양하게 동작하여 다른 결과를 내는 것(Overloading, Overriding)
- 부모 타입에는 모든 자식 객체가 대입 가능
- 인터페이스 타입에는 모든 구현 객체가 대입 가능
Overloading : 동일한 클래스 내에서 같은 이름의 메소드가 파라미터의 개수나 타입에 따라 다른 기능을 하는 것
Overriding : 부모 클래스의 메소드를 자식 클래스의 용도에 맞게 재정의하여 코드의 재사용성을 높임
※ 다형성의 효과
- 객체를 부품화시키고 부품화된 객체들을 조립 가능하게 한다.
- 일관된 인터페이스(약속) 제공
- 유지보수 용이
- 재사용성 가능
◆ OOP 설계 원칙
※ 참고 사이트 https://www.nextree.co.kr/p6960/
두문자 | 약어 | 개념 |
S | SRP | 단일 책임 원칙(Single Responsibility Principle) - 한 클래스는 한 가지 종류의 책임(하나의 개념)만 가져야 한다. - 클래스를 변경해야 하는 이유는 오직 하나 뿐이어야 함을 의미한다. "1인분만 단위로 생각하자! 1인분들을 모아서 리트스화하면 된다!!" |
O | OCP | 개방-폐쇄 원칙(Open/Closed Principle) - 소프트웨어 요소는 확장에는 열려있으나 변경에는 닫혀 있어야 한다. - 기존 구성요소를 수정/변경하기보단 기존 구성요소를 확장해서 재사용해야 한다. "기존 프로그램에 문제가 생기지 않도록!! 우회하는 방향으로 확장!!" " |
L | LSP | 리스코프 치환 원칙(Liskov Substitution Principle) - 서브타입(하위)은 언제나 기반타입(상위)으로 대체(호환)할 수 있어야 한다. - 선언은 기반 클래스로, 생성은 구체 클래스로 대입한다(IS-A관계로 제한). "다형성으로 인한 확장효과를 얻기 위해 지켜야 할 규칙!!" |
I | ISP | 인터페이스 분리 원칙(Interface Segregation Principle) - 클라이언트는 자신이 사용하지 않는 메소드와 의존관계를 가지지 않도록 해야 한다. - 어떤 클래스가 종속될 때에는 가능한 최소한의 인터페이스만을 사용 해야 한다. "인터페이스의 단일 책임을 강조! 인터페이스를 분리해라!" |
D | DIP | 의존관계 역전 원칙(Dependency Inversion Principle) - 고차원 모듈은 저차원 모듈에 의존하면 안된다. - 기초클래스는 하위클래스가 누군지 몰라야 한다. "복잡한 컴포넌트 간의 커뮤니케이션 관계를 단순화하기 위한 원칙!" |
Q12. List, Set, Map의 차이에 대해서 설명해주세요.

자료구조는 list, stack, queue, hash table이 있다.
그 중에서 list, set, map의 차이점에 대해 알아보자
1. List : 저장공간이 필요에 의해 자동으로 늘어난다 ( 순서가 있는 저장공간 )
* 특징 : 순서가 있고, 중복을 허용(배열과 유사)
* 장점 : 가변적인 배열9배열이 자동으로 늘어남)
* 단점 : 원하는 데이터가 뒤쪽에 위치하는 경우 속도의 문제
* 방식 : equals()를 이용한 데이터 검색
자바에서 list자료 구조는 크게 vector, arraylist, linkedlist로 나눠진다.
1) Arraylist : 객체 내부에 있는 배열에 데이터를 저장한다
- 상당히 빠르고 크기를 맘대로 조절할 수 있는 배열
- 단방향 포인터 구조로 자료에 대한 순차적인 접근에 강점
2) Vector : Arraylist와 동일하게 사용이 가능하다
- ArrayList의 구형버전이며, 모든 메소드가 동기화 되어있다
- 잘 쓰이진 않는다
Arraylist와 Vector의 차이점은 한 데이터에 동시접속이 발생했을 때, 처리가 가능한 기능이 있나 없나의 차이점
동시 접속을 고려하여 만들어진 리스트가 Vector이다
Arraylist는 동시접속을 고려안했지만 가볍다는 장점이 있다.
3) Linkedlist
- 양방향 포인터 구조로 데이터의 삽입, 삭제가 빈번할 경우 빠른 성능을 보장한다
- 스택, 큐, 양방향 큐 등을 만들기 위한 용도로 쓰인다
- Iterator를 사용한다
▶ Iterator 추출 전용 인터페이스
- 데이터를 추출하기 위한 데이터 임시 저장공간
- 주로 순서가 없는 자료구조의 값들을 추출할 때 사용
- 보통 hasNext와 next 메소드를 이용한 while문으로 값을 추출한다.
사용하는 이유는 linked 특성상 항상 처음부터 같은 경로를 반복적으로 지나면서 데이터의 위치를 검색해야하기 때문에 마지막으로 접근한 데이터를
기준으로 그 다음 데이터를 알아내는 것이 더 쉽다
2. Set : 집합, 순서가 없다. 집합이므로 중복된 데이터가 들어갈 수 없다.
중복되지 않는 숫자(데이터)를 구할 때 사용하면 유용하다.
* 특징 : 순서가 없고, 중복을 허용하지 않는다
* 장점 : 빠른 속도
* 단점 : 단순 집합의 개념으로 정렬하려면 별도의 처리가 필요하다
▶ hashSet의 key값은 hashcode 비교에 의해 중복여부가 확인된다.
hashCode()를 가지고 비교하고 ==로 비교해서 true를 리턴하거나 equals()로 비교해서 true를 리턴하는지 체크
element를 덮어 쓸 것인지 결정하면 된다.
Hashset은 Iterator를 사용한다
왜냐하면, set은 순서가 없기 때문에 데이터에 순서를 정해 추출해야한다.
3. Map : 키와 데이터를 같이 저장
* 특징 : Key(키)랑 Value(값)으로 나눠서 데이터 관리, 순서는 없으며, 키에 대한 중복은 없음
* 장점 : 빠른 속도
* 단점 : Key의 검색 속도가 검색 속도를 좌우
1) HashMap : index번호 대신 키값으로 값을 찾는 맵형태의 자료구조도 iterator 클래스를 이용해서 키값을 순서대로 iterator에 저장해두면 순서대로 데이터 추출이 가능하다.
출처: https://milkoon1.tistory.com/44 [EMDI는 지금도 개발중]
Q13. 컬렉션과 스트림의 차이에 대해서 설명해주세요.
스트림과 컬렉션의 차이점
스트림과 컬렉션은 둘다 연속된 요소형식의 값을 저장하는 자료구조 인터페이스를 제공합니다. 그렇다면
컬렉션과 스트림은 어떤 차이점이 존재할까요??
비유적인 표현으로 HDD에 저장된 영상파일과 인터넷에있는 유튜브 영상을 비교해볼수 있습니다.
HDD에 저장된 영상파일의 경우 내가 보고싶은 지점을 클릭하면 바로 재생되지만 유튜브같은 온라인 스트리밍
동영상 같은 경우는 클릭한 재생 지점 근처만 로딩이 되고 다른 부분을 클릭하면 그때마다 데이터를 다시
읽어서 재생하는 방식입니다.
1. 데이터 계산 시점
이처럼 스트림과 컬렉션의 차이는 데이터를 언제 계산하는지 입니다.
- 컬렉션 : 모든 요소는 컬렉션에 추가하기전에 계산되어야 한다.
- 스트림 : 요청할때만 요소를 계산하는 고정된 자료구조
사용자가 요청하는 값만 추출할수 있는 특성때문에 스트림은 컬렉션보다 프로그래밍에 장점이 있습니다.
만약 소수의 집합을 만들고 사용자가 원하는 지점의 소수를 알고싶다고 할때 컬렉션의 경우 소수를 만드는
과정에서 무한루프에 빠져버리기 때문에 사용자는 원하는것을 얻지 못할것입니다.
반면 스트림의 경우 사용자가 요청할때만 값을 계산하므로 이러한 문제에 유연하게 대처할수 있습니다.
2. 반복의 일회성
컬렉션과 스트림은 반복처리를 할때도 차이가 있습니다. 컬렉션의 경우 같은 소스에 대하여 여러번
반복 처리를 할수 있지만 스트림은 단 한번만 반복문을 처리할수 있습니다.
스트림에서는 소비(Consumer) 개념을 쓰기 때문에 한번 소비한 요소에 대해서 접근할수 없기 때문입니다.
Stream<Food> s = foodList.stream();
s.forEach(System.out::println); // 정상
s.forEach(System.out::println); // IllegalStateException 발생
만약 위 코드를 실행한다면 stream has already been operated upon or closed 라는 에러와 함께
프로그램이 중단될것입니다.
3. 외부반복, 내부반복
컬렉션의 경우 foreach 문법을 사용하여 사용자가 반복문을 직접 명시해야 하는데 이를 외부반복 이라 하고
스트림은 라이브러리를 사용하는 내부반복 개념입니다.