New World

[JAVA #2] 타입과 접근제한자, 추상화 클래스 본문

Self-Study/Study

[JAVA #2] 타입과 접근제한자, 추상화 클래스

hyeovi 2022. 9. 20. 23:03
728x90
반응형

접근제한자(public > protected > default > private)

 

변수 또는 메소드의 접근 범위를 설정해주기 위해서 사용하는 Java 의 예약어를 의미하며 총 네 가지 종류가 존재한다.

 

public

  • 접근 제한이 없다.(같은 프로젝트 내에 어디서든 사용가능)
  • 어떤 클래스, 어디서든 접근 가능

protected

  • 같은 패키지 내, 다른 패키지에서 상속받아 자손클래스에서 접근 가능
  • 클래스가 정의되어 있는 해당 패키지 내 그리고 해당 클래스를 상속받은 외부 패키지의 클래스에서 접근이 가능

default

  • 같은 패키지 내에서만 접근 가능
  • 클래스가 정의되어 있는 해당 패키지 내에서만 접근이 가능하도록 접근 범위를 제한

private

  • 같은 클래스 내에서만 접근 가능
  • 정의된 해당 클래스에서만 접근이 가능하도록 접근 범위를 제한한다.

 

new String()과 “”의 차이

객체를 생성하였을 경우 각 객체의 메모리상의 위치가 다른 것

 

"" : String은 String Pool에 추가가 되고 해당 값을 참조 값

new String() : String은 Heap 영역에 새로운 객체를 등록

 

Static

클래스 멤버라고 하며, 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할 때 클래스별로 관리됩니다.

  • static 키워드를 통해 생성된 정적멤버들은 PermGen 또는 Metaspace에 저장되며 저장된 메모리는 모든 객체가 공유하며 하나의 멤버를 어디서든지 참조할 수 있다.
  • GC의 관리 영역 밖에 존재하여 프로그램 종료시까지 메모리가 할당된 채로 존재한다.
  • 너무 남발하게 되면 시스템 성능에 악영향을 줄 수 있어 적정히 사용해야한다.
  • 어떠한 값이 메모리에 한번 할당되어 프로그램이 끝날 때 까지 그 메모리에 값이 유지되어 특정한 값을 공유해야하는 상황에 사용한다.
  • 클래스가 로딩될 때, 메모리 공간을 할당하는데 처음 설정된 메모리 공간이 변하지 않음을 의미
  • 객체를 아무리 많이 만들어도 해당 변수는 하나만 존재(객체와 무관한 키워드)

 

자바의 메모리 영역

  • 메서드 영역
    • static 변수, 전역 변수, 코드에서 사용되는 Class 정보 등이 할당
  • 스택(Stack)
    • 지역 변수, 함수(메서드) 등이 할당되는 LIFO(Last In First Out) 방식의 메모리
  • 힙(Heap)
    • new 연산자를 통한 동작할당된 객체들이 저장되며, 가비지 컬렉션에 의해 메모리가 관리

 

힙과 스택의 차이점

힙은 동적메모리를 사용하여 런타임시에 메모리영역을 원하는 크기로 잡을 수 있다.

스택은 정적메모리를 사용하여 컴파일 시 크기가 정해져있다.

 

Primitive type과 Reference type

Primitive type Reference type
변수에 값 자체를 저장 메모리상에 객체가 있는 위치를 저장
  • 정수형 byte, short, int, long
  • 실수형 float, double
  • 문자형 char
  • 논리형 boolean
종류 - Class, Interface, Array 등
* Primitive type은 Wrapper Class를 통해 객체로 변형 가능

Primitive type의 다른 자료형들은 맨 앞 알파벳을 대문자로 바꿔주면 된다.

예외 : int→Integer, char→Character

 Wrapper Class

 

기본 자료형(Primitive data type)에 대한 클래스 표현, Primitive type의 데이터를 객체로 만들 경우에 사용하는 클래스

 

사용하는 이유

  • 컬렉션에서 제네릭을 사용하기 위해서는 Wrapper class 를 사용
  • null 값을 반환하는 경우, return type 을 Wrapper class 로 지정하여 null을 반환
  • 해당 값을 비교할 때, .intValue() 메소드를 통해 해당 Wrapper class 의 값을 가져와 비교

 

박싱과 언박싱이란?

박싱 : 기본 자료형(Primitive data type)을 Wrapper class로 바꾸어 주는 것

언박싱 : Wrapper class를 기본 자료형(Primitive data type)으로 바꿔주는 것

 

JDK 1.5 부터 제공한다. 각 Wrapper class 에 상응하는 Primitive data type 일 경우에만 가능하다.

아래와 같은 경우에는, 자바 내부에서 AutoBoxing 해주어 박싱해줄 필요가 없다.

List<Integer> lists = new ArrayList<>();
lists.add(1);

String , StringBuilder


String
  • 불변, new 연산자를 통해 생성되면 인스턴스 메모리 공간이 절대 변하지 않는다 ( 할당시 Heap String Pool영역에 생성되어 그 값을 계속 사용 )
  • 동기화를 신경쓰지 않아도 된다
  • +, concat과 같은 연산시 메모리의 내용이 변하는 것이 아니라 새로운 String 인스턴스가 생성된다
StringBuffer StringBuilder
  • 문자열의 추가, 수정, 삭제가 빈번하게 발생하게 될 경우 사용
  • String과 다르게 클래스는 한번만 만들고 메모리의 값을 변경시켜서 문자열을 변경함.
동기화 지원 동기화 미지원
멀티쓰레드 환경에서 안정성 단일쓰레드 환경에서의 성능이 StringBuffer보다 뛰어남

 

? StringBuilder와 StringBuffer 각각의 차이에 대해 설명해주세요.

 

String은 불변이며 StringBuilder와 StringBuffer는 이런 String의 특징때문에 사용하는 가변타입입니다. StringBuilder는 동기화 되지 않아 Multi-Thread 환경에서 사용할 때는 StringBuffer를 사용합니다.

 

Interface, Abstract

Interface Abstract
- Implements 키워드를 사용
- 상속의 관계가 없는 클래스간 서로 공통되는 로직을 구현
- 하위 클래스를 제어하기 위해 사용
- 하위 클래스를 참조하여 상위 클래스의 객체를 생성
- 자신의 생성자로 객체 생성 불가능
다중 상속 다중 상속 불가
추상 메소드 추상메서드를 1개 이상 클래스
상수만 선언 가능 일반 변수, 일반 메소드 선언 가능
일반 변수, 생성자를 가질 수 없음 일반 변수, 생성자를 가질 수 있다

 

final

final / finally / finalize() 차이

  • final
    • final class : 다른 클래스에서 상속하지 못합니다.
    • final method : 다른 메소드에서 오버라이딩하지 못합니다.
    • final variable : 변하지 않는 상수값이 되어 새로 할당할 수 없는 변수가 됩니다.
  • finally : try-catch or try-catch-resource 구문을 사용할 때, 정상적으로 작업을 한 경우와 에러가 발생했을 경우를 포함하여 마무리 해줘야하는 작업이 존재하는 경우에 해당하는 코드를 작성해주는 코드 블록입니다.
  • finalize() : Object 클래스에 정의되어 있으며  GC에 의해 호출되는 함수로 절대 호출해서는 안 되는 함수입니다. 이유는 GC가 발생하는 시점이 불분명하기 때문에 해당 메소드가 실행된다는 보장이 없습니다. 오버라이딩 되어 있으면 GC 가 이루어질 때 바로 Garbage Collecting 되지 않는다. GC 가 지연되면서 OOME(Out of Memory Exception)이 발생할 수 있다.
반응형
Comments