ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 기술 면접 - JAVA (OOP)
    기술 면접 2021. 4. 23. 00:08

    10. 오버로딩, 오버라이딩


    오버로딩

    • 매개변수의 타입과 개수를 변경하면서 같은 이름의 메소드를 여러 개 사용하는 기술

    오버라이딩

    • 상위 클래스가 가지고 있는 메소드를 하위 클래스에서 재정의하여 사용하는 기술
    • 다형성을 만들어낸다

    11. 인터페이스 vs 추상 클래스


    추상 클래스

    • 개념
      • 추상 메서드를 가지고 있으며, abstract로 선언된 클래스
    • 구현
      • 하위 클래스에서 상위 클래스의 모든 추상 메서드를 오버라이딩하여 실행 가능한 코드로 구현
    • 목적
      • 인스턴스를 생성하기 위함이 아니고, 상속을 위한 상위 클래스로 활용함 (인스턴스 생성 불가)
      • 여러 클래스의 공통된 부분을 추상화, 메서드의 동작을 하위 클래스에게 위임한다

    인터페이스

    • 개념
      • 추상 메서드와 상수만을 포함하고, interface 키워드를 사용하여 선언
    • 구현
      • 인터페이스를 상속받고, 추상 메서드를 모두 구현한 클래스를 작성
      • extends가 아닌 implements 키워드 사용, 인터페이스끼리 상속할 때는 extends 사용
    • 목적
      • 구현 객체의 같은 동작을 보장하기 위한 목적
      • 인터페이스에서 선언한 기능을 제공하기만 하면 된다
      • 서로 관련이 없는 클래스에서 공통적으로 사용하는 방식이 필요하지만 기능을 각각 구현할 필요가 있는 경우 사용
    • 특징
      • 모든 메서드는 추상 메서드이기 때문에, abstract public이며 생략 가능( 구현하지 않으면 의미 없기 때문에 public )
      • 상수는 public static final이며 생략 가능
      • 인터페이스를 상속 받아 새로운 인터페이스를 만들 수 있음
    • 장점
      • 개발 시간을 단축시킨다
        • 메서드를 호출하는 쪽에서는 메서드의 내용에 관계없이 선언부만 알면 되기 때문
      • 표준화 가능
        • 프로젝트에 사용되는 기본 틀을 인터페이스로 작성한 다음, 개발자들에게 인터페이스를 구현하여 프로그램을 작성하도록 함으로써 보다 일관되고 정형화된 프로그램의 개발이 가능
      • 서로 관계없는 클래스들에게 관계를 맺어준다
        • 서로 상속관계에 있지도 않고, 같은 조상 클래스를 가지고 있지 않은 서로 아무런 관계도 없는 클래스들에게 하나의 인터페이스를 공통적으로 구현하도록 함으로써 관계를 맺어줄 수 있음
      • 독립적인 프로그래밍이 가능해진다

    추상 클래스 vs 인터페이스

    • 추상 클래스는 하위 클래스는 상위 클래스를 구체화 시키는 것
    • 인터페이스를 구현한 클래스는, 인터페이스에 정의된 기능을 제공한다는 것을 보장하는 것
    • 추상클래스는 단일 상속, 인터페이스는 다중 상속 가능

    12. Wrapper 클래스


    • 프로그래밍을 하다보면 기본 타입의 데이터를 객체로 표현해야 하는 경우가 생긴다
    • 이럴 때 기본 타입을 객체로 다루기 위해서 사용하는 클래스들을 래퍼 클래스라고 함
    • 8개의 기본 타입을 바꿔준다

    래퍼 클래스의 종류

    기본타입(primitive type) 래퍼클래스(wrapper class)
    byte Byte
    char Character
    int Integer
    float Float
    double Double
    boolean Boolean
    long Long
    short Short

    래퍼 클래스를 사용하는 이유

    • 기본 타입을 객체로 만들어 null을 넣거나 메서드를 사용할 수 있다
    • 기본 타입은 Object 클래스가 아니기 때문에, 객체 취급을 하기 위해서는 Wrapper클래스로 변환해야 함
    • toString을 이용해 String 타입으로 바로 변환 가능
    • 제네릭에는 기본타입이 들어갈 수 없기 때문에, Wrapper클래스의 형태로 전달

    기본형 타입은 == 연산자로 비교할 수 있지만 래퍼 클래스는 불가능.

    언박싱을 하고 비교를 해야 한다 ( 보통 오토 언박싱 되긴 함 )

    13. 박싱, 언박싱, 오토 박싱, 오토 언박싱


    박싱

    • 기본 자료형의 데이터를 래퍼 클래스 객체로 만드는 과정

    언박싱

    • 래퍼 클래스의 데이터를 기본 자료형으로 만드는 과정

    오토 박싱

    • 해당 래퍼 클래스에 기본 자료형의 데이터를 대입하면 자동 박싱

    오토 언박싱

    • 기본 자료형에 래퍼 클래스 객체를 대입하면 자동 언박싱

    14. 직렬화(Serialization)


    • 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트 형태로 데이터 변환하는 기술과, 바이트로 변환된 데이터를 다시 객체로 변환하는 기술(역직렬화)
    • JVM의 메모리(힙 or 스택)에 있는 객체 데이터를 바이트 형태로 변환하는 기술과 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태
    // 직렬화할 클래스
    public class Member implements Serializable {
            private String name;
            private String email;
            private int age;
    
            public Member(String name, String email, int age) {
                this.name = name;
                this.email = email;
                this.age = age;
            }
    
            // Getter 생략
    
            @Override
            public String toString() {
                return String.format("Member{name='%s', email='%s', age='%s'}", name, email, age);
            }
    • Serializable 인터페이스를 구현한다면 직렬화 할 수 있는 기본 조건을 가짐

    SerialVersionUID 선언 이유

    자바가상기계 (JVM)은 직렬화와 역직렬화를 하는 시점의 클래스에 대한 버전 번호를 부여합니다. 만약 그 시점에 클래스의 정의가 바뀌어 있다면 새로운 버전 번호를 할당합니다. 그래서 직렬화할 때의 버전 번호와 역직렬화를 할 때의 버전 번호가 다르면 역직렬화가 불가능하게 될 수도 있습니다. 이런 문제를 해결하기 위해 SerialVerionUID를 사용합니다.

    간단명료하게 serialVersionUID값을 저장할 때 클래스 버전이 맞는지 확인하기 위한 용도입니다.

    만약 직렬화할 때 사용한 serialVersionUID의 값과 역직렬화 하기 위해 사용했던 serialVersionUID값이 다르다면 InvalidClassException이 발생할 수 있습니다

    자바 직렬화 참조 링크

    댓글

Designed by Tistory.