기술 면접 준비 (1)

Ada·2022년 12월 19일
0

자유 공부

목록 보기
1/19

Java

자바의 특징은 객체지향 프로그래밍 언어로써, 기본 자료형을 제외한 모든 요소들이 객체로 표현되고, 객체 지향 개념의 특징인 캡슐화, 상속, 다형성이 잘 적용된 언어입니다.

장점 : JVM 위에서 동작하기 때문에 운영체제에 독립적이고 GC(GabageCollector) 를 통한 자동적인 메모리 관리가 가능합니다.

단점 : JVM 위에서 동작하기 때문에 실행 속도가 상대적으로 느리고 다중 상속이나 타입에 엄격하며, 제약이 많습니다.


  • 캡슐화 : 비슷한 역할을 하는 속성과 메소드들을 하나의 클래스로 모은 것

    • 정보 은닉 : 캡슐 내부의 로직이나 변수들을 감추고 외부에는 기능(api)만을 제공하는 것
  • 상속 : 클래스를 재사용 하는 것. 상위 클래스의 멤버 변수나 메소드를 물려 받아 코드를 재사용 할 수 있어 생산성이 높고 유지보수 하기 좋다.

  • 추상화 : 어떤 실체로부터 공통적인 부분이나 관심 있는 특성들만 한 곳에 모은 것.
    어떠한 하위 클래스들에 존재하는 공통적인 메소드를 인터페이스로 정의하는 것

  • 다형성 : 같은 모양의 함수가 상황에 따라 다르게 동작하는 것.

    • 오버로딩 : 함수의 이름은 같으나 매개변수의 숫자, 타입을 달리 해서 다르게 사용하는 것
    • 오버라이딩 : 상위 클래스의 메소드를 하위 클래스에서 똑같은 이름으로 재정의 하는 것

JVM 의 역할

Java Byte Code를 OS에 맞게 해석 해주는 역할을 하고 가비지컬렉션을 통해 자동적인 메모리 관리를 해줍니다.

Java 의 컴파일 과정

개발자가 .java 파일을 생성하고 build하면 java compiler의 javac 명령어를 통해 바이트코드(.class)를 생성합니다.

Class Loader를 통해 JVM 메모리 내로 로드합니다.

실행엔진을 통해 컴퓨터가 읽을 수 있는 기계어로 해석됩니다.

객체 지향 프로그래밍

프로그램 구현에 필요한 객체를 파악하고 각각의 객체들의 역할이 무엇인지 정의하여 객체들 간의 상효작용을 통해 프로그램을 만드는 것입니다.

객체는 클래스라는 틀에서 생겨난 실체를 말 합니다.

따라서 객체 지향 프로그램은 객체와 객체 간의 연결로 되어있으며 각각의 객체 안에 자료구조와 알고리즘이 들어있습니다.

불변 객체나 final을 사용하는 이유

  1. Thread-Safe 하여 병렬 프로그래밍에 유용하며, 동기화를 고려하지 않아도 된다.

  2. 어떤 예외가 발생되어도 메소드 호출 전의 상태를 유지할 수 있어 예외 발생 전과 같은 상태로 다음 로직 처리가 가능하다.

  3. 부수효과(변수의 값이 바뀌거나 객체의 필드 값을 설정하거나 예외나 오류가 발생하여 실행이 중단되는 현상) 을 피해 오류를 최소화 할 수 있다.

  4. 메소드 호출 시 파라미터 값이 변하지 않는다는 것을 보장할 수 있다.

  5. 가비지 컬렉션 성능을 높일 수 있다.(가비지 컬렉터가 스캔하는 객체 수가 줄기 때문에 GC 수행 시 지연 시간도 줄어든다.)

추상 클래스와 인터페이스

추상 클래스는 클래스 내 추상 메소드가 하나 이상 포함되거나 abstract 로 정의된 경우이고, 인터페이스는 모든 메소드가 추상 메소드로만 이루어져 있는 것을 말합니다.

공통점은 new 연산자로 인스턴스 생성이 불가능하고, 사용하기 위해서는 하위 클래스에서 확장/구현 해야 합니다.

차이점은 인터페이스는 그 인터페이스를 구현하는 모든 클래스에 대해 특정한 메소드가 반드시 존재하도록 강제함에 있고, 추상 클래스는 상속받는 클래스들의 공통적인 로직을 추상화 시키고, 기능 확장을 위해 사용한다는 점 입니다.

추상 클래스는 다중상속이 불가능 하지만, 인터페이스는 다중 상속이 가능합니다.

싱글톤 패턴

싱글톤 패턴은 단 하나의 인스턴스를 생성해 사용하는 디자인 패턴으로 인스턴스가 1개만 존재해야 한다는 것을 보장하고 싶은 경우와 동일한 인스턴스를 자주 생성해야 하는 경우에 주로 사용합니다.

싱글톤 패턴은 생성자의 호출이 반복적으로 이루어져도 실제로 생성되는 객체는 최초 생성된 객체를 반환해주기 때문에 메모리 낭비를 방지해줍니다.
또한 이미 생성된 인스턴스를 활용함으로써 작업 속도가 빨라지며 싱글톤 객체는 전역성을 띄기 때문에 다른 객체와 공유가 용이하여 다른 클래스 간에 데이터 공유가 쉽습니다.

가비지 컬렉션(Garbage Collection)

가비지 컬렉션은 JVM의 메모리 관리 기법 중 하나로 시스템에서 동적으로 할당됐던 메모리 영역 중에서 필요없어진 메모리 영역을 회수하여 메모리를 관리해주는 기법입니다.

GC의 작업을 수행하기 위해 JVM이 어플리케이션의 실행을 잠시 멈추고, GC를 실행하는 쓰레드를 제외한 모든 쓰레드들의 작업을 중단 후 (Stop The World 과정) 사용하지 않는 메모리를 제거(Mark and Sweep 과정)하고 작업이 재개됩니다.

++ GC의 작업은 Young 영역에 대한 Minor GC와 Old 영역에 대한 Major GC로 구분됩니다.

객체지향의 설계원칙

SRP - 단일 책임 원칙 : 한 클래스는 하나의 책임만 가져야 한다.

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

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

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

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

Java의 메모리 영역

자바의 메모리 공간은 크게 Method 영역, Stack 영역, Heap 영역으로 구분되고, 데이터 타입에 따라 할당됩니다.

  • 메소드(Method) 영역 : 전역변수와 static변수를 저장하며, Method영역은 프로그램의 시작부터 종료까지 메모리에 남아있습니다. JVM이 동작해서 클래스가 로딩될 때 생성됩니다.

  • 스택(Stack) 영역 : 지역변수와 매개변수 데이터 값이 저장되는 공간이며, 메소드가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제된다. LIFO(Last In First Out) 구조를 갖고 변수에 새로운 데이터가 할당되면 이전 데이터는 지워진다. 컴파일 타임 시 할당된다.

  • 힙(Heap) 영역 : new 키워드로 생성되는 객체(인스턴스), 배열 등이 Heap 영역에 저장되며, 가비지 컬렉션에 의해 메모리가 관리되어 진다. 런타임시 할당 된다.

클래스와 객체

클래스는 객체를 만들어내기 위한 설계도 혹은 틀 이라고 할 수 있고, 객체를 생성하는데 사용합니다.

객체는 설계도(클래스)를 기반으로 생성되며, 자신의 고유 이름과 상태, 행동을 갖습니다.

여기서 상태는 필드(fields), 행동은 메소드(Method)라고 표현합니다.

객체에 메모리가 할당되어 실제로 활용되는 실체는 '인스턴스'라고 부릅니다.

생성자

생성자는 클래스와 같은 이름의 메소드로, 객체가 생성될 때 호출되는 메소드입니다.

명시적으로 생성자를 만들지 않아도 default로 만들어지며, 생성자는 파라미터를 다르게하여 오버로딩할 수 있습니다.

Static

static 키워드를 사용한 변수나 메소드는 클래스가 메모리에 올라갈 때 자동으로 생성되며 클래스 로딩이 끝나면 바로 사용할 수 있습니다. 즉, 인스턴스(객체) 생성 없이 바로 사용 가능합니다.

모든 객체가 메모리를 공유한다는 특징이 있고, GC 관리 영역 밖에 있기 때문에 프로그램이 종료될 때까지 메모리에 값이 유지된 채로 존재하게 됩니다.

static은 자주 변하지 않는 값이나 공통으로 사용되는 값 같은 공용자원에 대한 접근에 있어서 매번 메모리에 로딩하거나 값을 읽어들이는 것보다 일종의 '전역변수'와 같은 개념을 통해 접근하는 것이 비용도 줄이고 효율을 높일 수 있습니다.

인스턴스 생성 없이 바로 사용 가능하기 때문에 프로그램 내에서 공통으로 사용되는 데이터들을 관리할 때 이용합니다.

profile
백엔드 프로그래머

0개의 댓글