백엔드

자바 기술 면접 정리 2

coyojo 2023. 5. 9. 11:16

 

클래스는 무엇이고 객체는 무엇인가요?

 객체(Object)?

객체(Object) 물리적으로 존재하거나 추상적으로 생각할 있는  중에서 자신의 속성을 가지고 있고 다른 것과 식별 가능한 것을 말한다. 예를 들어 물리적(유형)으로 존재하는 자동차, 컴퓨터, 사람과 추상적(무형)으로 존재하는 강의, 주문 등이 모두 객체가 있다
사람이라는 객체는 이름, 나이, 성별 등과 같은 속성과 먹다, 걷다, 자다 등의 동작을 가진다.
Java
에서는 이러한 속성들을 필드(field), 동작들을 메소드(method)라고 부른다.

 

 클래스(Class)?

 클래스(Class) Java 프로그램에서 객체를 생성하기 위한 일종의 설계도이다. 객체가 가지는 속성(필드) 동작(메소드)으로 이루어져 있다. 흔히 붕어빵(객체) 만들기 위한 붕어빵 (클래스)이라고 비유를 한다. 클래스는 필드(Field), 생성자(Constructor), 메소드(Method) 구성되어 있다. 이들은 생략될 수도 있고 하나 이상 작성될 수도 있다.
필드: 객체의 데이터가 저장되는 곳이다.

생성자: 객체가 실제로 생성될 초기화 역할을 담당한다.

메소드: 객체의 동작에 해당하는 실행 블록이다.

 

 

 

정적(static)이란 무엇인가요?

Static

Java에서 Static 키워드를 사용한다는 것은 메모리에 한번 할당되어 프로그램이 종료될 해제되는 것을 의미합니다.
이를 정확히 이해하기 위해서는 메모리 영역에 대한 이해가 필요합니다.

일반적으로 우리가 만든 Class Static 영역에 생성되고, new 연산을 통해 생성한 객체는 Heap영역에 생성됩니다.
객체의 생성시에 할당된 Heap영역의 메모리는 Garbage Collector 통해 수시로 관리를 받습니다.
하지만 Static 키워드를 통해 Static 영역에 할당된 메모리는 모든 객체가 공유하는 메모리라는 장점을 지니지만,
Garbage Collector
관리 영역 밖에 존재하므로 Static 자주 사용하면 프로그램의 종료시까지 메모리가 할당된 채로 존재하므로 자주 사용하게 되면 시스템의 퍼포먼스에 악영향을 주게 됩니다.

Static 변수 특징

: 객체를 생성하지 않고도 static 자원에 접근이 가능
Static 변수는 클래스 변수입니다. 객체를 생성하지 않고도 Static 자원에 접근이 가능합니다.

Static 변수(정적 변수)

·        메모리에 고정적으로 할당되어, 프로그램이 종료될 해제되는 변수
Java에서 Static 변수는 메모리에 한번 할당되어 프로그램이 종료될 해제되는 변수로, 메모리에 한번 할당되므로 여러 객체가 해당 메모리를 공유하게 됩니다.
 

 

자바의 원시타입들은 무엇이 있나요?
  • 정수형 byte, short, int, long
  • 실수형 float, double
  • 문자형 char
  • 논리형 boolean이 있습니다

 

접근 제어자의 종류와 이에 대해 설명해주세요.
  • 변수 또는 메소드의 접근 범위를 설정해주기 위해서 사용하는 Java 예약어를 의미하며, 4 가지 종류가 있습니다.
  • public - 접근 제한이 없다. (같은 프로젝트 어디서든 사용 가능)
  • protected - 해당 패키지 , 다른 패키지에서 상속받아 자손 클래스에서 접근 가능하다.
  • (default) - 해당 패키지 내에서만 접근 가능
  • private - 해당 클래스에서만 접근 가능

 

 

객체지향에 대해서 설명해주세요.
즉, 기능이 아닌 객체가 중심이며 "누가 어떤 일을 것인가?"가 핵심이다.
객체 지향 프로그래밍의 4가지 특징은 각각 추상화, 상속, 다형성, 캡슐화
 
객체 지향 프로그래밍은 프로그램 구현에 필요한 객체를 파악하고 상태와 행위를 가진 객체를 만들고 각각의 객체들의 역할이 무엇인지를 정의하여 객체들 간의 상호작용을 통해 프로그램을 만드는 것을 말합니다.
특징으로는 캡슐화상속, 다형성, 추상화 등이 있고, 모듈 재사용으로 확장 유지보수가 용이합니다.


프로그램을 수많은 '객체(object)'라는 기본 단위로 나누고 이들의 상호작용으로 서술하는 방식이다. 객체란 하나의 역할을 수행하는 '메소드와 변수(데이터)' 묶음으로 봐야 한다.
가장 큰 이점 중에 하나는 객체 지향적 설계를 통해서 프로그램을 보다 유연하고 변경이 용이하게 만들 있다는 입니다. 소프트웨어를 설계할 때 객체 지향적 원리를 잘 적용해 둔 프로그램은 객체가 각자의 독립적인 역할을 가지기 때문에 코드의 변경을 최소화하고 유지보수를 하는 유리합니다
SOLID(객체지향 5대원칙)에 대해서 설명해주세요.

💡 객체지향의 설계원칙에 대해 설명해주세요.
  1.  SRP - 단일 책임 원칙 (Single Responsibility): 클래스는 하나의 책임만 가져야 한다.

  2.  OCP - 개방-폐쇄 원칙(Open-Closed) : 확장에는 열려있고, 수정에는 닫혀있어야 한다

  3.  LSP - 리스코프 치환 원칙 : 상위 타입은 항상 하위 타입으로 대체할 있어야 한다

    4. ISP - 인터페이스 분리 원칙 : (Interface Segregation)   :   인터페이스 내에 메소드는 최소한 일수록 좋다. (하나의 일반적인 인터페이스보다 여러 개의 구체적인 인터페이스가 낫다.) SRP 같은 문제에 대한  가지 다른 해결책이다.

    5.DIP - 의존관계 역전 원칙 (Dependency Inversion): 구체적인 클래스보다 상위 클래스, 인터페이스, 추상클래스와 같이 변하지 않을 가능성이 높은 클래스와 관계를 맺어라DIP 원칙을 따르는 가장 인기 있는 방법은 의존성 주입(DI)이다.
 

동일성(identity)와 동등성(equality)에 대해 설명해주세요.

동일성(identity)은 동일하다는 뜻으로 두 개의 객체가 완전히 같은 경우를 의미한다. 여기서 완전히 같다는 뜻은 두 객체가 사실상 하나의 객체로 봐도 무방하며, 주소 값이 같기 때문에 두 변수가 같은 객체를 가리키게 된다.
동등성(equality) 동등하다는 뜻으로 두 개의 객체가 같은 정보를 갖고 있는 경우를 의미한다. 동등성은 변수가 참조하고 있는 객체의 주소가 서로 다르더라도 내용만 같으면 두 변수는 동등하다고 이야기할 수 있다. 동일하면 동등하지만, 동등하다고 동일한 것은 아니. 그리고 해당 변수가 동등한지 equals 연산자를 통해 판별할 수 있다.
(equals(), ==)원시타입과 참조타입의 차이에 대해 설명해주세요.


 == 연산자는 원시타입(정수형 byte,short,int,long,실수형 double,float, 문자형 char, 논리형 Boolean) 대해서는 값을 비교한다. 참조형 변수 타입에 대해서는 주소값을 비교한다. 사실 primitive type Constant Pool 있는 특정 상수를 참조하는 것이기 때문에 결국 주소값을 비교하는 것으로 있다.
같은 상수를 참조하면 주소값이 같으니 결국 같은 값이면 동일하다고 판단할 있다.

가장 중요한 포인트는 == 주소값이 같은지 아닌지 비교하는 것이고, equals()연산도 내부적으로 주소값을 비교하지만 String클래스에서는 equals() 재정의해 객체간의 값인 내용을 비교하게 되어있다.