자바 질문 모음 _ 1

자바 질문

  1. 클래스와 객체
  2. 자바 기본형과 Wrapper 클래스
  3. 자바 컬렉션 종류와 차이점
  4. String 객체의 equals 메서드 VS == 연산자
  5. 추상화란?
  6. 추상클래스란?
  7. 인터페이스란?
  8. 추상클래스 VS 인터페이스
  9. String Mutable 이란?

원본출처, 내용출처


클래스와 객체

클래스

객체를 정의하는 틀 또는 설계도. 객체의 상태를 나타내는 필드와 객체의 행동을 나타내는 메소드로 구성. 필드(field)란 클래스에 포함된 변수를 의미하고, 메소드(method)란 어떠한 특정 작업을 수행하기 위한 명령문의 집합

객체

설계도 또는 틀로 찍어낸 실체. 클래스의 인스턴스라고도 함.

자바에서 클래스를 사용하기 위해서는 우선 해당 클래스 타입의 객체(object)를 선언해야 합니다. 이렇게 클래스로부터 객체를 선언하는 과정을 클래스의 인스턴스 화라고 합니다. 또한, 이렇게 선언된 해당 클래스 타입의 객체를 인스턴스(instance)라고 합니다. 즉, 인스턴스란 메모리에 할당된 객체를 의미합니다.

자바에서는 하나의 클래스로부터 여러 개의 인스턴스를 생성할 수 있습니다. 이렇게 생성된 인스턴스는 독립된 메모리 공간에 저장된 자신만의 필드를 가질 수 있습니다. 하지만 해당 클래스의 모든 메소드(method)는 해당 클래스에서 생성된 모든 인스턴스가 공유하게 됩니다.

클래스 VS 객체

클래스는 객체들이 어떤 특성을 갖는다고 정의만하고 값은 가질 수 없으나 객체는 실존하며 각각 자신만의 고유한 속성 값을 갖는다.

위로


자바 기본형과 Wrapper 클래스

8개의 기본 데이터를 객체 형식으로 다루기위해 JDK에 의해 지원되는 8개의 클래스(Byte, Short, Integer, Long, Character, Double, Float, Boolean)를 통칭하여 Wrapper 클래스라고 말한다.

int, double 등 자바 기본 데이터 타입은 클래스가 아니다. 따라서 기본 데이터 값도 객체가 아니다.

위로


자바 컬렉션 종류와 차이점

img

인터페이스 구현 클래스 특징
List LinkedList
Stack
Vector
ArrayList
순서가 있는 데이터의 집합, 데이터의 중복을 허용한다.
Set HashSet
TreeSet
순서를 유지하지 않는 데이터의 집합, 데이터의 중복을 허용하지 않는다.
Map HashMap
TreeMap
HashTable
Properties
키(key)와 값(value)의 쌍으로 이루어진 데이터의 집합이다. 순서는 유지되지 않고, 키는 중복을 허용하지 않으며 값의 중복을 허용한다.


1. Collection Interface

모든 컬렉션의 상위 인터페이스로써 컬렉션들이 갖고있는 핵심 메소드가 선언되어있음(add, contain, isEmpty, remove, size, iterator …)

1-1. List Interface

Collection 인터페이스를 확장한 자료형으로 요소들의 순서를 저장하여 색인(Index)를 사용하여 특정 위치에 요소를 삽입하거나 접근할 수 있으며 중복 요소 허용

  • Vector

    • 배열의 동적 사용을 위해 Java 1.0부터 제공되는 클래스
    • ArrayList의 구형버전이며, 내부적으로 synchronized를 통해 구현되어있어 동기화 보장
    • 그러나 멀티 스레드 환경에서 성능이 좋지 않아 잘 쓰이진 않음
  • ArrayList

    • 내부적으로 데이터를 배열에서 관리하며 삽입, 삭제시 임시 배열을 생성하여 데이터를 복사하는 구조
    • 단점으로 추가, 삭제 시 오버헤드가 크기때문에 대량의 데이터를 다루기에는 부적절
    • 데이터마다 인덱스를 가지고 있어 순차적인 접근에 강점이 있음
  • LinkedList
    • 데이터를 노드에 저장하고 양방향 포인터로 데이터를 삽입, 삭제하는 구조로 데이터 삽입, 삭제가 빠르다는 장점이 있다
    • 하지만 검색 시 노드를 처음부터 순회해야하므로 비교적 느림
    • 스택, 큐, 양방향 큐 등을 만들기 위한 용도로 쓰임
1-2. Set Interface

집합을 정의하며 요소의 중복을 허용하지 않음. 상위 메소드만 사용

  • HashSet
    • 가장 빠른 임의 접근 속도
    • 순서를 전혀 예측할 수 없음
  • LinkedHashSet : 추가된 순서 또는 가장 최근에 접근한 순서대로 접근 가능
  • TreeSet : 정렬된 순서대로 보관하며정렬 방법을 지정할 수 있음


2. Map Interface

Key와 Value의 쌍으로 연관지어 저장하는 객체

  • HashMap
    • Map 인터페이스를 구현하기 위해 해시테이블을 사용한 클래스
    • 중복 허용 X, 순서 보장 X
    • 키와 값으로 null 허용
  • HashTable
    • HashMap 보다는 느리지만 동기화 지원
    • 키와 값으로 null 허용X
  • TreeMap
    • 이진 탐색 트리(BST) 형태로 키와 값의 쌍으로 이루어진 데이터를 저장
    • 정렬된 순서로 키/값 쌍을 저장하므로 빠른 검색 가능
    • 저장 시 정렬(오름차순)을 하기 때문에 저장시간이 다소 오래걸림
  • LinkedHashMap
    • 기본적으로 HashMap을 상속받아 HashMap과 매우 흡사
    • Map에 있는 엔트리들의 연결 리스트를 유지하므로 입력한 순서대로 반복 가능

참고 : 컬렉션 프레임워크의 개념, Java의 Collections (List, Set, Map) 이해

위로


equals 메서드 VS == 연산자

Q. 아래 코드의 결과 예상
1
2
3
String s1 = "abc";
String s2 = new String("abc");
s1 == s2;
  • 정답 : false
  • 이유 : s1은 literal로 String Constant Pool에서 관리되고, s2는 new 연산자를 통해 Heap 영역에 String 객체를 생성하기 때문. == 연산자는 객체의 주소값을 비교하는 연산자로, 같은 객체를 참조하는 것이 아니기때문에 false
    • literal : 값이 변하지 않는 immutable 클래스이며, 이전에 생성했던 문자열을 중복 생성할시 SCP에서 해당 문자열을 불러와 참조
    • 자바에서 객체를 참조하는 변수(str)는 Stack 메모리, 생성된 객체는 Heap 메모리에 저장
Q. 위 연산을 true로 만들려면?
  1. s1.equals(s2) 문자열 자체를 비교한 결과이므로 true
  2. s2.intern()를 이용하면 SCP의 문자열을 가져와 비교하므로 true
    • intern() 메소드는 SCP를 탐색해서 문자열이 존재하면 그것을 리턴하고, 아니면 새로운 문자열을 SCP에 추가한 후 다시 반환한다. 따라서 new를 사용하건 literal을 사용하건 intern() 메소드를 사용하면 같은 문자열을 반환하게 된다.
Q. String Constant Pool이 위치하는 영역은?
  • Heap 영역

  • Java 7부터 Perm 영역에서 Heap으로 바뀜

    • 이점 : SCP의 모든 문자열도 GC의 대상이 될 수 있음

참고 : Java String 의 메모리에 대한 고찰

위로


추상화

어떤 객체를 표현함에 있어 모든 것을 다 표현하는 것이 아니라 일정 부분 특징만을 표현. 추상화를 하게 되면 목적을 위해 필요한 부분만을 찾을 수 있다. (공통된 개념과 관계에 집중할 수 있게 됨)

위로


추상클래스

  1. 추상 메소드(선언은되어있으나 코드 구현X, 껍데기만 있는)를 포함하는 클래스(abstract로 선언)
  2. 추상메소드가 하나도 없지만 abstract로 선언한 클래스
추상클래스의 용도

추상클래스를 상속받은 서브 클래스는 개발자에 따라 다양하게 구현 (모든 개발자들이 서브 클래스에서 추상 클래스에 선언된 추상 메소드를 필수로 구현해야 한다)

추상클래스를 책의 목차에 비유하면, 서브 클래스는 목차에 따라 작성된 실제 책과 같다.

추상 클래스를 이용하면 응용프로그램의 설계와 구현을 분리할 수 있다.

추상 클래스로 기본 방향을 잡아놓고 서브 클래스에서 구현하면 구현 작업에 쉬워진다. 또한, 추상 클래스는 계층적 상속 관계를 가지는 클래스들의 구조를 만들 때 적합하다.

참고 : 다형성-추상클래스

위로


인터페이스

  1. 자바의 인터페이스는 추상 클래스와 유사.

  2. 인터페이스는 규격과 같은 것.(따라서 인터페이스를 수정할 때는 기존 인터페이스를 상속받아 새로운 인터페이스를 만듦. 자바는 클래스의 다중상속X, 인터페이스 다중상속O)

  3. 멤버는 추상메소드(publicabstract), 상수(public static final) 만으로 구성

  4. 모든 메소드는 public이며 생략 가능

  5. 객체를 생성할 수 없음

  6. 다른 인터페이스 상속O

  7. 인터페이스 구현 : 인터페이스의 추상 메소드를 클래스에서 구현하는 것. (implements 키워드)

    이때 클래스는 반드시 인터페이스의 모든 추상메소드를 구현해야 함.

  8. 인터페이스를 사용하는 이유 : 사용 될 클래스가 어떠한 멤버들을 갖고 있는가에 대한 명세서와 같은 역할

참고 : 다형성-인터페이스

위로


추상클래스 VS 인터페이스

1. 공통점

  • 메소드의 선언만 있고 구현 내용이 없는 클래스
  • 따라서 추상클래스와 인터페이스를 가지고 새로운 인스턴스를 생성할 수 없다.
  • 추상클래스를 extends로 구현한 자식클래스나, 인터페이스를 implements한 자식 클래스만이 객체를 생성할 수 있다.
  • Is-a 관계가 핵심 (Ex. 냉장고 is a 가전제품, 커피머신 is a 가전제품)
  • 결국 자식 클래스가 무언가 반드시 구현하도록 위임해야할 때 사용해야한다.

2. 차이점

추상클래스
  • 미완성된 설계도

  • 추상메서드(abstract method)가 하나라도 존재하는 클래스

  • 일부는 구현된 일반 메서드도 존재
  • 요약 : 다중상속 불가, 멤버변수 존재 가능, 일반 메서드 존재 가능
인터페이스
  • 밑그림만 있는 기본 설계도

  • 구현하는 모든 클래스에 대해 특정 메서드가 반드시 존재하도록 강제하여 구현 객체들이 같은 동작을 하도록 보장는 역할

  • Java 8 부터 default 키워드를 통해 일반 메서드 구현 가능
  • 주 목적은 구현 객체가 같은 동작을 한다는 것을 보장하기 위함
  • 요약 : 다중상속 가능, 상수만 존재 가능, 모든 멤버가 public

참고 : Java 인터페이스와 추상클래스 공통점, 차이점 정리, 인터페이스(interface)와 추상 클래스(abstract class), 자바의 추상클래스와 인터페이스

위로


String Mutable

  • Mutable(가변) 객체 : 객체 내의 특정요소를 변경 할 수 있는 객체 (Ex. List, ArrayList, HashMap)
  • Immutable(불변) 객체 : 객체 내의 특정 요소의 값을 변경 할 수 없는 객체 (Ex. String, Integer, Double, Long). setter 없음. heap 영역에서 변경불가 라는 뜻(String a = ”a”; a = ”b” 와 같은 재할당은 가능)
StringBuffer VS String

StringBuffer는 Mutable, String은 Immutable

참고 : Java에서 String, StringBuilder, StringBuffer의 차이

위로


Share