면접준비

Dogeun Lee·2023년 7월 18일
0
post-thumbnail

✨JAVA의 특징

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

장점
1. JVM(자바가상머신) 위에서 동작하기 때문에 운영체제에 독립적
2. GabageCollector를 통한 자동적인 메모리 관리가 가능

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

JVM이란 ?

스택 기반으로 동작하며, Java Byte Code를 OS에 맞게 해석 해주는 역할을 하고 가비지컬렉션을 통해 자동적인 메모리 관리를 해줌

스택?

데이터를 저장하고 접근하는 방식으로, 가장 최근에 추가된 데이터가 가장 먼저 제거되는 구조
( LIFO - 후입선출 ) Last in First Out

자바 바이트코드?

JVM에서 실행되는 중간 언어로, 자바 소스 코드를 컴파일하여 생성되며 JVM이 해석하고 실행하는 명령어들로 구성

Compiled from "HelloWorld.java"
public class HelloWorld {
  public HelloWorld();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #3                  // String Hello, World!
       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return
}

✨객체지향 프로그래밍이란?

객체가 중심이며 "누가 어떤 일을 할 것인가?"가 핵심
실제 세계의 작동 원리를 프로그래밍에 반영하는 것.
데이터 그리고 메서드를 하나의 단위로 캡슐화 하여

  • 코드의 재사용
  • 유지보수성
  • 모듈성을 향상

객체란?

추상화 된 클래스를 실체화 한 형태

객체지향의 특징

  1. 캡슐화 ( encapsulation )
  • 관련된 데이터와 동작을 하나로 묶어 외부로부터의 접근을 제어
  1. 추상화 ( abstraction )
  • 실제 세계의 개체를 추상적으로 모델링하여 클래스와 인터페이스를 사용해 속성과 동작을 정의
  1. 다형성 ( polymorphysm )
  • 동일한 메서드를 다른 타입으로 인식하고 실행할 수 있는 것
  1. 상속 ( inheritance )
  • 기존 클래스의 특성을 이어받아 새로운 클래스를 생성

✨ Java의 컴파일 과정

  1. 개발자가 java 파일을 생성 하고 빌드
  2. java compiler의 javac의 명령어를 통해 바이트코드(.class)를 생성한다.
  3. Class Loader를 통해 JVM 메모리 내로 로드한다.
  4. 실행엔진을 통해 컴퓨터가 읽을 수 있는 기계어로 해석된다.(각 운영체제에 맞는 기계어)

✨ Java에서 제공하는 원시 타입

정수형 byte, short, int, long 실수형 float, double 문자형 char 논리형 boolean
정수형 1, 2, 4, 8, 실수형 4, 8, 문자형 2, 논리형 1 바이트를 차지.

String은?

원시타입이 아닌 참조타입이다
객체를 참조하는 변수로, 실제 데이터는 힙(heap)에 저장되고 변수는 해당 데이터를 가리키는 역할을 하는것이 참조타입
문자열을 나타내는 데 사용되는 클래스, 문자열을 저장하고 조작하는 다양한 메서드를 제공하며, 불변(immutable)성을 가지기 때문에 수정할 수 없는 문자열을 나타냄


✨ Overriding 과 Overloading

  • 오버라이딩(Overriding)
    상위 클래스에 있는 메소드를 하위 클래스에서 재정의 하는 것
  • 오버로딩(Overloading)
    매개변수의 개수나 타입을 다르게 하여 같은 이름의 메소드를 여러 개 정의하는 것

✨ 추상 클래스와 인터페이스

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

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

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

추상클래스의 예시

// 추상 클래스
abstract class Animal {
    String name;
    
    public Animal(String name) {
        this.name = name;
    }
    
    // 추상 메서드
    abstract void makeSound();
    
    // 일반 메서드
    public void sleep() {
        System.out.println(name + " is sleeping");
    }
}

// 추상 클래스를 상속받은 구체적인 클래스
class Cat extends Animal {
    public Cat(String name) {
        super(name);
    }
    
    // 추상 메서드 구현
    @Override
    void makeSound() {
        System.out.println(name + " says Meow");
    }
}

// 추상 클래스를 상속받은 구체적인 클래스
class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }
    
    // 추상 메서드 구현
    @Override
    void makeSound() {
        System.out.println(name + " says Woof");
    }
}

다중 상속을 받는 인터페이스의 예시

// 다중 상속을 받는 인터페이스
interface Printable {
    void print();
}

interface Showable {
    void show();
}

// 다중 상속을 받은 인터페이스
interface PrintableAndShowable extends Printable, Showable {
    void display();
}

// 다중 상속을 받은 인터페이스를 구현한 클래스
class Displayable implements PrintableAndShowable {
    @Override
    public void print() {
        System.out.println("Printing...");
    }
    
    @Override
    public void show() {
        System.out.println("Showing...");
    }
    
    @Override
    public void display() {
        System.out.println("Displaying...");
    }
}
profile
오대수

2개의 댓글

comment-user-thumbnail
2023년 7월 18일

아주 중요한 정보를 얻었습니다, 감사합니다.

답글 달기
comment-user-thumbnail
2023년 7월 18일

글 잘 봤습니다, 감사합니다.

답글 달기