Skip to content

Latest commit

 

History

History
528 lines (365 loc) · 26.4 KB

File metadata and controls

528 lines (365 loc) · 26.4 KB

로이의 기술면접 질문 Depth 기준표

depth 0 검색하면 바로 나오는 내용 위주인 경우. 내용을 모르더라도 즉석으로 생각해내서 대답할 수 있는 단계
depth 1 검색하면 바로 나오는 내용에서 약간의 꼬리질문이 들어오는 경우, 검색을 통해서 조금 읽어봐야 하는 단계
depth 2 검색을 통해서 읽고, 이해가 필요한 경우. 배경지식이 없으면 대답하기 어려운 단계
depth 3 검색을 해서 한참 읽고 생각해야 하는 경우, 배경지식이 없으면 이해를 하지 못하는 단계
depth 4 검색을 해도 거의 내용이 나오지 않는 경우, 정답이 없는 경우. 읽어봐도 전혀 모르는 내용인 단계

Q: 객체지향 프로그래밍이 무엇인지, 객체지향 언어 특징, 절차지향 언어와의 차이점에 대해 말해주세요. (depth 0)

객체지향 프로그래밍은 프로그래밍 패러다임의 하나입니다. 객체지향 언어는 소프트웨어를 객체의 모음으로 보고 객체들의 상호작용을 통해 동작하는 방식으로 이루어져 있습니다. 객체지향 언어의 특징은 캡슐화, 상속, 추상화, 다형성입니다. 객체지향 언어와 절차지향 언어의 차이점은 객체지향 언어는 객체의 기능과 행동을 중심으로 생각합니다. 반면 절차지향 언어는 순차적인 실행과 데이터를 중심으로 생각합니다.

캡슐화: 객체의 속성과 기능을 하나로 묶고, 불필요한 정보는 외부로 노출시키지 않는것

상속: 상위 클래스의 속성과 기능을 하위 클래스가 물려 받는것

추상화: 공통적인 속성과 기능을 추출하고 단순화 하는것

다형성: 한 객체가 여러 형태로 재구성되거나 다른 동작을 하는것

✅ Q: Java의 특징을 말해주세요. (depth 0)

A: 자바는 크게 다섯가지의 특징이 있습니다. 첫번째로 자바는 객체지향 언어로 유지보수가 쉽고 확장성이 높습니다. 두번째로 자바 가상 머신 위에서 동작하기 때문에 운영체제에 상관없이 동작하기 때문에 이식성이 높습니다. 세번째로 가비지 컬렉터가 메모리를 자동으로 관리해줘 안정성이 높습니다. 네번째로 기본적인 스레드 API를 지원해 멀티스레드 구현이 쉽습니다. 다섯번째로 네트워킹, 파일 I/O 등 강력한 표준 라이브러리등이 있다는것 입니다.

Q: Java를 사용하는 이유는? (depth 4)

Java는 객체지향언어중 가장 대중적이고 많은 엔터프라이즈급 회사에서 오랜기간 사용되어 안정성 보장된 언어라고 생각하여 사용하고 있습니다.

Q: ✅Java8과 Java11 특징에 대해서 말해주세요. (depth 1)

Java8의 특징

  • Heap Permanent Generation 제거
  • 인터페이스에 디폴트 메서드와 정적 메서드 추가
    • 디폴트 메서드는 기존 코드와의 호환성 - 이전에는 인터페이스의 모든 메서드 구현
    • 정적 메서드는 인터페이스에서 유틸리티 메서드 제공하여 일관성 향상
  • 함수형 인터페이스, 람다 표현식, 메서드 참조 기능 추가
  • 스트림 API 도입
  • 새로운 날짜 관련 라이브러리 추가
  • Optional 지원
  • 병렬 처리 지원

Java11의 특징

  • Spring에 새로운 메서드 추가
  • Files 클래스에 새로운 메서드 추가
  • 컬렉션 인터페이스에 새로운 메서드 추가 (ex: toArray 오버로딩 메서드 참)
  • Predicate 인터페이스에 새로운 메서드 추가
  • Collections.of 와 같은 불변 객체 메서드 추가
  • 람다에서 로컬 변수 Var 사용
  • 자바 파일 실행 방식 단순화
    • java9에서 변경된 G1 GC 컬렉터를 사용하여 메모리 관리 용이

✅ Q: 자바의 실행 과정 (depth3)

A: 먼저 자바 언어를 사용해 '.java' 확장자를 가진 파일에 프로그램을 작성합니다. 이후 자바 컴파일러를 통해 자바 코드를 컴파일하여 바이트 코드로 변환하고, 이 과정을 거쳐 '.class' 파일이 생성됩니다. 다음으로 JVM의 클래스 로더가 바이트 코드를 로드하고 검증하여 문제가 없으면, 클래스와 관련된 메타데이터를 메타스페이스(Java 8 이상) 또는 퍼머넌트 영역(Java 8 미만)에 적재하고, 객체 인스턴스는 힙 영역에 저장합니다. JIT 컴파일러는 자주 사용되는 바이트 코드 영역을 기계어로 변환하여 코드 캐시에 저장하고, 이후에는 인터프리터를 거치지 않고 바로 CPU에서 실행됩니다. 인터프리터는 나머지 바이트 코드를 명령어 단위로 실행합니다. 프로그램 실행이 완료되면, 사용된 모든 리소스는 정리되고 JVM은 종료됩니다.

Q: ✅바이트 코드와 바이너리 코드의 차이점에 대해 말해주세요. (depth 1)

바이트 코드는 고수준 프로그래밍 언어를 컴파일한 결과로 중간 코드입니다.

따라서 가상 머신에서 동작하고 높은 이식성과 휴대성을 가집니다.

반면에 바이너리 코드는 기계어로 바로 컴파일된 결과입니다. OS나 하드웨어 아키텍쳐 맞게 컴파일 되어야 하기에 종속성을 가집니다. 일반적으로 바이트 코드보다 실행 속도가 빠릅니다.

✅Q: 예제를 통해서 stack 영역에서 어떤일이 일어나는지 설명해 주세요. (depth2)

예제 해설

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> listArgument = new ArrayList<>();
        listArgument.add("yaboong");
        listArgument.add("github");

        print(listArgument);
    }

    private static void print(List<String> listParam) {
        String value = listParam.get(0);
        listParam.add("io");
        System.out.println(value);
    }
}

✅ Q: 자바 언어의 특징은?

  • 독립적 운영
    • JVM에서 동작하기 때문에, 운영체제에 독립적이다.
  • 객체지향 프로그래밍
    • OOP - Object Oriented Programing
    • 계층 구조, 캡슐화, 상속, 추상화, 다형성 등을 구현한 객체지향 언어다.
  • 메모리를 자동으로 관리 → GC로 추가 질문 가능
    • Garbage Collection을 통해 불필요한 메모리를 자동으로 제거해 준다.
  • 오픈 소스
    • 오픈 소스로 풍부한 라이브러리가 제공된다.
  • 멀티스레드 구현
    • 공통 스레드 API를 제공해서 운영체제에 관계없이 멀티스레드를 쉽게 구현할 수 있다.

객체지향 프로그래밍의 특징

  • 추상화
    • 공통의 속성이나 기능을 묶어서 표현
  • 캡슐화
    • 높은 응집도와 낮은 결합도를 유지하는 설계방법
  • 상속 혹은 일반화
    • 부모 클래스를 상속하여 확장하여 쓸 수 있다.
  • 다형성
    • 오버로딩
    • 오버라이딩

SOLID 원칙

  • single responsibility priciple
    • 객체는 하나의 책임만을 가친다.
  • open closed principle
    • 확장에는 열려있고 수정에 대해서는 닫혀잇어야 합니다.
    • 이를 지키기 위해서는 추상화에 의존해야 합니다. 기능을 구체화하고 확장할 수 있습니다.
  • liskov substitution priciple
    • 하위 타입은 상위 타입을 대체할 수 있어야 합니다.
  • interface segregation principle
    • 클래스는 자신과 관련없는 인터페이스는 구현하지 않는다.
  • dependency iversion priciple
    • 상위 모듈은 하위 모듈에 종속되면 안된다.

객체지향 프로그래밍을 하는 이유

  • 코드의 재사용성 증가
  • 유지보수 용이성
  • 간결한 코드
  • 높은 확장성
  • 강한 응집력과 약한 결합력
  • 보안성 향상
  • 소프트웨어 생산성 향상

✅ Q: 자바 어플리케이션의 실행 과정

  • 개발자가 자바 코드를 작성합니다. (.java)
  • 컴파일러로 이를 컴파일하여 (.class)파일로 만듭니다. 이는 바이트코드로 작성되어있습니다.
    • 자바 소스를 컴파일하면 바이트코드가 나옵니다.
  • 클래스 로더가 JVM메모리에 이 바이트 코드를 올립니다.
    • 근데 이때 모든 클래스를 다 업로드하는 것이 아니라, 그때그때 필요한것만 우선적으로 메모리에 올립니다.
  • 실행 엔진이 이 바이트 코드를 실행합니다.
    • ByteCode를 해석합니다.
    • ByteCode가 BinaryCode로 변경됩니다.
    • 만약 실행하다 필요한 코드가 없으면 클래스로더에 요청을 합니다.
    • JIT 컴파일러를 통해 자주 사용하는 코드를 캐싱합니다.

클래스 로드 과정

  • 로딩
    • .class를 JVM의 메모리에 로드합니다.
  • 링킹 linking
    • 검증 : 바이트 코드가 자바의 규칙을 따르고 있는지 검증합니다.
    • 준비 : 클래스가 필요한 메모리를 미리 할당해둡니다.
    • 분석 : 클래스가 참조하는 객체에 대해 메모리 주소값을 대입해줍니다.
  • 초기화
    • 클래스 내부에 static 을 할당하고 초기화 시킵니다.

✅  Q: JVM 가비지 컬렉션의 동작 방식

  • Root Space : 힙영역을 참조하고 있는 reference count
    • 순환 참조를 주의할 것 → memory leak
  • mark and sweep : JVM에서 사용
    • root space부터 연결된 객체를 그래프로 탐지
      • jvm의 root space는 Stack의 로컬변수, method area 에 저장된 static변수, native method stack의 c/c++로작성된 JNI참조
    • sweep이후에 compaction 이 이 있습니다.
    • 단점
      • 의도적으로 GC를 실행시켜야한다는 단점이있습니다.
      • 어플리케이션 실행과 GC실행이 병행됩니다.
  • Heap영역
    • young generation
      • eden → 꽉차면 minor GC
      • survival 0
      • survival 1
    • old generation → age bit가 일정 수준이 넘어가면 old generation으로 넘겨줍니다. (promotion) 자바 8기준 15가 되면 프로모션됩니다. 이것도 꽉차면 major GC가 일어납니다.
  • 왜 이렇게 나누어서하나요?
    • 대다수의 객체가 빨리 사라지기 때문
  • Stop the world
    • GC를 실행하기 위해 어플리케이션을 멈춥니다.
    • 이를 최소화하는 것이 좋습니다.

종류

  • Serial GC
    • 스레드 1개로 GC를 실행합니다.
    • 싱글 스레드 환경, Heap영역이 매우 작을 때 사용합니다.
  • Parallel GC
    • 여러개의 스레드로 GC를 실행
    • 멀티 코어 환경에서 사용합니다
    • Java 8에서 기본 GC 방식
  • CMS GC
    • concurrent mark sweep
    • GC 작업을 어플리케이션과 동시에 지행
    • 컴팩션이 동작하지 않는다.
  • G1 GC
    • Garbage First
    • Heap을 Region으로 나누어 사용
      • 필요에 따라 개수를 튜닝하여 사용. Stop the world 최소화
    • Java 9부터 기본 GC

✅ Q: String, StringBuilder, StringBuffer의 차이점과 언제 사용하는지 알려주세요.

  • String
    • 자바에서는 String 객체의 값은 변경할 수 없습니다.
    • 불변 자료형이라고 불립니다.
    • 이렇게 한 이유가 캐싱, 보안, 동기화 성능 측면에서 이점을 얻기 위해서입니다.
    • String 상수 풀에서 각 리터럴 문자열을 하나씩만 저장하여 다시 저장하거나 캐싱에 이용가능하여 힙메모리를 절약할 수 있습니다.
    • 문자열의 참조값은 변경하여 애플리케이션
    • 여러 스레드에서 안정적으로 공유가 가능하도록 합니다.
    • Java 5 이상부터는 String 인스턴스에 새로운 문자열을 조합할 경우 컴파일러가 최적화하여 StringBuilder로 변환해주지만 StringBuilder 또한 새로 생성되는 인스턴스이기 때문에 성능을 고려하며 코드를 작성해야 한다.
    • String 클래스는 크기가 고정되어 있으므로 단순하게 읽는 조회 연산에서는 StringBuffer나 StringBuilder클래스보다 빠르게 읽을 수 있는 장점이 있습니다.
  • StringBuilder, SpringBuffer의 경우
    • 문자열을 연산(추가하거나 변경)할 때 주로 사용하는 자료열입니다.
    • + 이나 concat() 메서드로 문자열을 이어붙이면 새로운 String 인스턴스를 생성하게 되어 힙 메모리가 낭비될 수 있습니다.
    • StringBuffer 로 연산할 경우 내부적으로 버퍼 Buffer 를 사용하여 독립적인 공간을 가지고 연산할 수 있어 연산 속도가 매우 빨라집니다. 기본 16버퍼 크기로 생성됩니다.
    • 가변적이고, Thread Safe 하지 않습니다.
  • StringBuffer
    • 힙 메모리에 생성됩니다.
    • 가변적이지만 Thread Safe합니다.
    • StringBuffer의 경우에는 append 메소드에 synchronized 를 붙여주어 해당 로직에 lock을 걸어 동기화를 보장하였다.
/**
 * Adds the character array to the end of this StringBuffer.
 *
 * @param		chars	the character array
 * @return		this StringBuffer
 *
 * @exception	NullPointerException when chars is null
 */
public **synchronized** StringBuffer append (char[] chars) {
	int currentLength = lengthInternalUnsynchronized();
	int currentCapacity = capacityInternal();
	
	...
}
  • String 상수풀은 Java 8 이전에는 Permgen 영역에 할당되어 Method area에 위치하였다. Java 8 이후에는 Permgen 영역이 제거되고 Metaspace 영역으로 변경되면서 Perm 영역에 있던 정보들 중 static 변수나 String 상수풀은 Heap 영역으로 이동하여 GC가 관리될 수 있도록 개선되었다.

✅Q: 자바 메모리 구조


Q: Static 에 관하여

Static과 non- Satatic

일단 생성되는 위치부터 다릅니다. static은 Method 메머리 영역에 저장되면(밑에 나오지만 반만 맞음) 동일 클래스의 모든 객체가 공유합니다.

static 맴버들은 클래스 로딩시에 맴버가 생성되며 동일 클래스의 모든 인스턴스 맴버 (객체) 들에게 공유됩니다.

즉 객체 초기화 없이 정적 필드에 접근할 수 있습니다.

Static의 저장 위치

정적 멤버는 Class와 함께 클래스 로더에 의해서 Method Area에 저장되지 않을까 생각했습니다.

몰랐던 사실이지만 static 변수는 실제로는 heap 영역에 저장됩니다.

https://www.scaler.com/topics/java/static-variable-in-java/

https://headf1rst.github.io/TIL/jvm-static

https://jgrammer.tistory.com/144

Java 8 버전 이전에는 클래스의 
정적 변수가 클래스 컴파일  Java 가상 머신에 
의해 생성된 메서드 영역이라는 이름의   메모리 별도 
섹션에 저장되었습니다. 메서드 영역 섹션은 클래스의 정적 
변수, 클래스의 메타데이터 등을 저장하는  사용되었습니다.
 반면, 비정적 메서드와 변수는  메모리에 저장되었습니다.

정리하자면 java 7 이전과 8로 나눌 수 있는데

java 7전까지는 PermGen(Method Area)에 저장 그 이후는 힙에 저장됩니다.

Sataic 메서드

Java의 정적 메서드는 컴파일 타임에 해결됩니다. 메서드 재정의는 런타임 다형성의 일부이므로 정적 메서드는 재정의할 수 없습니다

물론 추상클래스도 Sataic 메서드를 사용 할 수 없습니다.

슈퍼 키워드도 사용할 수 없습니다.

인스턴스 메서드는 정적 변수와 정적 메서드에도 직접 접근할 수 있습니다.

정적 메서드는 모든 정적 변수와 다른 정적 메서드에 접근할 수 있습니다.

정적 메서드는 인스턴스 변수와 인스턴스 메서드에 직접 접근할 수 없습니다.

Q: java 예외 스택과 예외와 관련

간단히 말해 스택 추적은 특정 시점의 호출 스택을 표현한 것으로, 각 요소는 메서드 호출을 나타냅니다. 스택 추적에는 스레드가 시작된 시점부터 생성된 시점까지의 모든 호출이 포함됩니다. 이 시점은 일반적으로 예외가 발생하는 위치입니다.

https://www.javatpoint.com/java-stack-trace

스택 추적의 첫 번째 줄에서는 예외 스택의 실행 지점을 나타내고, 두 번째 줄부터 마지막 줄까지는 전체 스택 추적을 구성하는 스택 프레임을 얻습니다. 가장 먼저 실행된 메서드가 스택 추적의 마지막 스택 프레임이 되고 마지막에 실행된 메서드가 스택 추적의 첫 번째 스택 프레임이 됩니다.

커스텀 예외를 고려하자

https://docs.oracle.com/javase/8/docs/api/?java/lang/RuntimeException.html

https://tecoble.techcourse.co.kr/post/2020-08-17-custom-exception/

사실 이미 java api에 충분히 표준 예외를 많이 제공하고있다.

일일히 예외 클래스를 만들다보면 지나치게 커스텀 예외가 많아질 수 있다.

지나치게 많은 클래스를 만들면 당연히 디렉토리 구조도 어려워지고 메모리 문제도 생길겁니다.

그럼 사용자 예외는 언제 사용하나요?

장점 :

1. 이름으로도 정보 전달이 가능하다.

2. 상세한 예외 정보를 제공할 수 있다.

4. 예외 발생 후처리가 용이하다.

표준예외는 재사용 성은 높지만 발생 위치를 정확하게 파악하기 힘들다.

커스텀 예외는ExpectedException을 구현한 뒤, 모든 사용자 정의 예외가 해당 예외를 상속받도록 한 뒤 Advice에서는 ExpectedException을 처리하는 메소드 하나로 예외 처리 코드를 간소화할 수 있을 것이다.

✅ Q: java 8 이후의 Optional API 등 Null point Exception에 관하여

항상 개발자는Runtime 시점에 발생 할 수 있는 NPE에 대비 해야합니다(Null Point Exception)

https://dev-coco.tistory.com/178

Java8 부터 Optional을 제공하여 null로 인한 예외가 발생하지 않도록 도와주고, Optional 클래스의 메소드를 통해 null을 컨트롤 할 수 있습니다.

https://dzone.com/articles/using-optional-correctly-is-not-optional

https://tecoble.techcourse.co.kr/post/2021-06-20-optional-vs-null/

null을 직접 대입하지마라

Optional<Cart> emptyCart = null;

get을 썻다면Optional.isPresent()로 증명해라

if (cart.isPresent()) {
    Cart myCart = cart.get();
    ... // do something with "myCart"
} else {
    ... // do something that doesn't call cart.get()
}

명시적으로 변수에 대한 null을 표현할 수 있고 null체크를 직접 하지 않습니다.

단점

• Wrapper 클래스이기 때문에 두 개의 참조를 가지므로 생성 비용이 비싸다.

  • 직렬화 불가능하기 때문에 클래스의 인스턴스 필드로 사용하면 안된다.
  • 필드로 사용하기 위해 고안된 것이 아니기 때문에 값을 반환하는 용도로 사용해야 한다.

이 코드보다는

public String findStationName(Optional<Station> optStation) {
        if (optStation.isPresent()) {
            return optStation.get().getName();
        }
        return new Station("존재하지 않는 역").getName();
    }

이런 코드가 더 맞다

public String findStationName(Optional<Station> optStation) {
        return optStation.orElse(new Station("존재하지 않는 역")).getName();
    }

Optional이라는 것은 결국 Optional에게 null처리를 위임 하는것이고 null체크를 할 필요가없다 ispResent와 같이

✅ Q: GC 동작방식

가비지 컬렉션(Garbage Collection, 이하 GC)은 자바의 메모리 관리 방법 중의 하나로 JVM(자바 가상 머신)의 Heap 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객체(garbage)를 모아 주기적으로 제거하는 프로세스를 말한다.

Untitled

장단점

단점

  • 메모리가 언제 해제되는지 정확하게 알 수 없어 제어하기 힘들며, 가비지 컬렉션(GC)이 동작하는 동안에는 다른 동작을 멈추기 때문에 오버헤드가 발생되는 문제점이 있다.

GC를 수행하기 위해 JVM이 프로그램 실행을 멈추는 현상을 의미한다.

  • Reachable : 객체가 참조되고 있는 상태
  • Unreachable : 객체가 참조되고 있지 않은 상태 (GC의 대상이 됨)

Mark And Sweep으로 제거한다.

Young 영역(Young Generation)

  • 새롭게 생성된 객체가 할당(Allocation)되는 영역
  • 대부분의 객체가 금방 Unreachable 상태가 되기 때문에, 많은 객체가 Young 영역에 생성되었다가 사라진다.
  • Young 영역에 대한 가비지 컬렉션(Garbage Collection)을 Minor GC라고 부른다.

Old 영역(Old Generation)

  • Young영역에서 Reachable 상태를 유지하여 살아남은 객체가 복사되는 영역
  • Young 영역보다 크게 할당되며, 영역의 크기가 큰 만큼 가비지는 적게 발생한다.
  • Old 영역에 대한 가비지 컬렉션(Garbage Collection)을 Major GC 또는 Full GC라고 부른다.

더 알아보기

종합적으로 메모리 닉이나 그와 관련해 힙덤프를 분석해 메모리 누수가 난 곳을 찾아본다던지 이를 apm등을 활용해 모니터링 시스템을 구축해 장기적으로 좋은 서비스를 만들수 있다.

memory leak

일명 메모리누수 개발자가 의도치 않게 메모리를 잡아먹는경우

Heap Dump

어플리케이션에서 여러 요청이 올시 힙을 분석 하는 여러툴 ex) java scouter등으로

어떤 요청에서 객체가 생성되어 얼마만큼의 자원을 먹는지 분석할 수있다.

APM

scouter, 제니퍼

참고: https://tecoble.techcourse.co.kr/post/2021-08-30-jvm-gc/

https://inpa.tistory.com/entry/JAVA-☕-가비지-컬렉션GC-동작-원리-알고리즘-💯-총정리

https://mirinae312.github.io/develop/2018/06/04/jvm_gc.html

https://www.youtube.com/watch?v=v1gb397uFC4&t=4s

https://techblog.woowahan.com/2628/ 메모리 릭

https://jupiny.com/2019/07/15/java-heap-dump-analysis/ 힙덤프

  • JVM 에 관하여

✅ Q: JVM 에관하여

https://velog.io/@leekhy02/JAVA-JVM-자바-가상-머신 https://inpa.tistory.com/entry/JAVA-☕-JVM-내부-구조-메모리-영역-심화편


✅ Q: 자바의 접근 제어자에 대해 설명해주세요

접근 제어자는 4가지 분류에 따라 생성자, 필드, 메서드, 클래스의 사용 범위를 결정합니다.

  • public: 모든 외부 클래스가 접근할 수 있다.
  • protected: 같은 패키지 또는 자식 클래스에서 접근할 수 있다.
  • default: 같은 패키지 내에서만 접근할 수 있다.
  • private: 외부에서 접근할 수 없고 해당 클래스에서만 접근할 수 있다.

접근 제어자는 OOP의 캡슐화를 적용하기 위해 사용합니다.

캡슐화로 클래스 내부 정보를 외부로부터 숨겨 결합도를 낮출 수 있습니다.

출처: 혼자 공부하는 자바(신용권 저)

Q: 자바의 변수에 대해 설명해주세요

자바에서는 4가지의 변수가 존재합니다. 각 변수는 사용 범위와 생명주기가 다릅니다.

  • 지역 변수(local variable)

    • 메서드 블록(중괄호) 내에서 선언된 변수
    • 지역 변수를 선언한 메서드 블록 내에서만 사용되고 메서드 실행이 끝나면 메모리에서 없어집니다.
  • 매개 변수(parameters)

    • 메서드에 넘겨주는 변수
    • (매개변수의 이름은 메서드 시그니처에 정의되며, 메서드를 호출할 때마다 다른 값이 전달될 수 있지만 메서드 내에서 해당 매개변수의 이름은 유효합니다.)
    • 메서드가 호출될 때 생명이 시작되고, 메서드가 끝나면 소멸된다.
  • 인스턴스 변수(instance variable), 필드

    • 메서드 밖에, 클래스 안에 선언된 변수. 앞에는 static이라는 예약어가 없어야 합니다.
    • (클래스의 각 인스턴스 마다 고유한 값을 가지며, 인스턴스의 상태를 나타내기 위해 사용합니다.)
    • 객체가 생성될 때 생명이 시작되고, 그 객체를 참조하고 있는 다른 객체가 없으면 소멸됩니다.
      • (gpt는 다른 객체와 상관없이 객체가 소멸할 때 함께 소멸한다고 함..)??
  • 클래스 변수(class variable)

    • 인스턴스 변수처럼 메서드 밖에, 클래스 안에 선언된 변수 중 static 예약어가 있는 변수
    • (클래스의 모든 인스턴스가 공유하는 변수이므로 인스턴스 마다 같은 이름과 값을 공유합니다.)
    • 클래스가 처음 호출될 때 생명이 시작되고, 자바 프로그램이 끝날 때 소멸됩니다.
  • ref.

    실제 면접때 받았던 질문 정리 (java, db, spring, web)

    Variables (The Java™ Tutorials >
    Learning the Java Language > Language Basics)

    자바의 신 VOL.1 - 예스24

    혼자 공부하는 자바 - 예스24

java 5이상에서는 string 연산은 stringbuilder로 변환된다.