You will be fine

<Interview> 1. JAVA 정리

by BFine
반응형

0. 프로그래밍

  • 프로그램은 원하는 결과물을 얻기 위해서 컴퓨터에 명령하는 명령어들의 집합이다.

  • 여기서 프로그래밍 언어는 이 명령어를 표현하는 도구이다.

  • 이 언어를 가지고 주변장치(하드웨어)간의 상호작용(순서 등)을 생각하면서 명령어를 표현하는 것이 프로그래밍이다.

  • 명령은 CPU에 의해 실행되어야 결과가 나타난다.

  • 이 명령을 CPU가 실행하기 위해서는 메인메모리에 적재되어 있어야한다.

  • 명령들은 주기억장치에 적제되기 전에는 하드디스크에 파일형태로 저장된다.(프로그램)

    가. 컴파일

    • 고급언어를 이용하여 코드를 기계어로 바꾸는 과정을 의미한다.
    • JIT(just-in-time) 컴파일러는 인터프리터로 번역한 코드를 기억하여 이후에 변화한 부분만 번역한다.

1. JAVA 특징

  • 플랫폼에 독립적이다.(JVM이 운영체제 위에서 동작)

  • 객체지향프로그래밍 언어이다.

  • 멀티스레드를 지원한다.

  • 메모리 자동괸리(가비지 컬렉터)를 지원한다.

  • 동적로딩 지원(객체가 필요한 시점에 로딩되어 생성됨)

    가. 인터프리터 & 컴파일러 언어

    • 인터프리터는 문장단위로 해석하고 바로 실행하는 언어 (동시에)
      • 실행속도 느림(번역은 빠름) / 가벼움 / 코딩 & 수정이 용이함
    • 컴파일러는 전체를 해석해 목적코드로 만든 후에 실행
      • 한번에 실행하기 때문에 속도가 빠름 / 메모리 효율 떨어짐

    나. 자바 구동(JVM)

    • 소스코드(.java) -> 컴파일러 -> 바이트코드(.class) -> 인터프리터 -> 실행 (속도는 느림)
    • 바로 목적코드를 만들지 않고 바이트코드를 만들어 실행되는 플랫폼을 맞춰 인터프리터로 해독(이식성)
    • 위의 과정을 담당 하는 것이 JVM이다.

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

  • 데이터들을 추상화 시켜서 상태와 행위를 가진 객체로 만들고 이들의 상호작용을 통해서 로직을 구현하는 프로그래밍 방법을 의미한다.

  • 장점 : 코드 재사용성, 유지보수 / 단점 : 처리속도 느림,

  • 키워드 : 클래스&객체 ,캡슐화, 추상화, 상속, 다형성

    가. 클래스 & 객체

    • 클래스는 속성과 행위를 정의한 설계도이다.(메서드, 변수)
    • 객체는 클래스를 통해 만들어진 것으로 메모리에 할당된 실제 사용되는 데이터이다.

    나. 캡슐화

    • Modifier를 이용해 데이터를 보호하고 감추는 작업을 말한다.

    다. 추상화

    • 어떤 것들에서 공통적인 특성, 기능 등을 추출하는 것이다.

    라. 상속

    • 부모클래스에 메서드와 변수를 상속받아 사용하는 것을 의미한다.

    마. 다형성

    • 하나의 인터페이스,클래스가 다양하게 해석될 수 있는 것을 의미한다.
    • 동일한 타입으로 다양한 결과가 나오는 성질을 의미한다.
    • 업캐스팅, 다운캐스팅

3. 오버로딩 vs 오버라이딩

  • 오버로딩은 메서드의 이름은 같지만 매개변수의 개수나 반환형을 달리주어 하나의 이름으로 여러개를 쓰는 것을 의미한다. (반환값 X)
  • 오버라이딩은 상속받은 메서드를 재정의 해서 사용하는 것을 의미한다.

4. Getter & Setter

  • 객체 외부에서 직접적인 접근을 막기 위해 사용한다. (OOP의 정보은닉)
  • 검증을 통해 유효한 값만 데이터로 저장한다.

5. 어노테이션

  • 어노테이션은 자바에서는 주로 메타데이터 기능, 스프링에서는 주로 설정관련 코드를 자동생성, 문법에러체크 등 기능을 한다.
  • 메타데이터란 컴파일 과정과 실행과정에서 코드를 어떻게 컴파일하고 처리할지 알려주는 것이다.(설명해주는 데이터)
  • @interface 를 붙여서 정의 한다.

6. 변수

  • 선언 위치에 따라서 클래스, 인스턴스, 지역 변수로 나뉜다.
  • 클래스변수 : static 키워드를 붙여서 선언한 변수를 전역변수라고도 한다.
  • 인스턴스변수 : 클래스 내부에 생성한 변수를 인스턴스 변수라고 한다.
  • 지역변수 : 블록 안에 선언 되었을 경우
  • new 연산자를 통해 만들어진 객체는 heap 영역에 저장되고 주소를 반환한다. NOTE : main을 가진 클래스(실행클래스)가 제일 먼저 메모리에 할당되고 로드되어 실행된다. 나머지는 멤버클래스

7. 예외처리

  • 컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램에 오류가 발생하는 것을 에러라고 한다.

  • 에러는 JVM 실행에 문제가 생긴 오류로 개발자가 코드 상으로 해결 할 수 없다.

  • 예외는 사용자의 잘못된 조작, 개발자의 잘못된 코딩으로 발생하는 프로그램 오류를 말한다.

  • 예외나 에러나 발생하면 프로그램이 종료된다.

    가. Checked Exception

    • 자바 소스를 컴파일하는 과정에서 예외처리 코드가 있는지 판단하는 예외

    나. Runtime Exception

    • 컴파일 하는 과정에서 예외처리 코드가 있는지 검사하지 안는 에외
    • Nullpointer, ArrayIndexOutofBounds, NumberFormat
    • 발생시 프로그램이 종료되는 것을 막기위해 예외처리 코드가 반드시 필요하다.(try-catch, throws)
    • throws 는 호출한 메서드로 예외를 떠넘기는 것을 의미한다. Exception 핸들러로 공통으로 처리 할수도 있다.

8. JVM 메모리구조

  • 클래스영역, 스택영역, 힙 영역 크게 3가지로 나눌 수 있다.

  • JVM이 .class 파일을 읽어 이 클래스에 대한 정보(클래스변수 등)를 저장하는 공간이다.

    가. 클래스영역

    나. 스택영역

    • 각 스레드마다 하나씩 존재하는 영역이다. 메서드가 호출되면 메모리가 할당된다. (다른 스레드의 Stack 영역에 접근 불가능)
    • 메서드가 작업을 수행하는 동안 지역변수나 매개변수, 중간결과 값들이 이곳에 저장된다.
    • 기본타입의 변수들의 실제값이 저장되고 참조타입의 변수들의 주소값이 할당된다.

    다. 힙영역

    • 사용자에 의해 동적으로 할당되는 영역이다. 스레드와 상관없이 하나만 존제하는 영역(다른 스레드 접근 가능)
    • new 연산자를 사용하여 생성된 객체, 배열, 참조타입 변수들의 값이 저장(긴 라이프사이클을 가지는 데이터들이 저장)

9. 가비지 컬렉터

  • 개발자가 메모리 할당을 해제(free())하지 않아도 자동으로 처리해주는 기능이다.

  • Stack 영역에서 Heap 영역에 있는 데이터에 접근 할 수 없는 경우 메모리 할당을 처리해준다.

  • 객체가 소멸되기 전에 JVM에서 호출하는 finalize()가 있다. (메모리 누수가 발생하지않게 할당메모리 해제, 100프로실행되지는 않는다.)

  • Heap의 두가지 영역 young과 old 영역이 존재하며 최초에 young안의 Eden영역에 데이터들이 할당된다.

  • 이때 Eden영역이 가득차면 GC가 일어나고 참조가 되는 데이터들은 survial 영역으로 옮겨진다. 그렇게 old 영역으로 가게된다.

  • Eden 영역은 비교적 짧게 GC가 일어나고 old 영역은 비교적 적은 GC 주기를 보인다.

  • Mark, Sweep 두가지 과정을 거쳐 메모리를 처리한다.

    • Mark는 객체들이 참조가 잘되어있는지 판단하는 과정으로 이때 모든 스레드는 중단된다.
    • 이떄 참조가 되어있지 않는 변수들을 처리하는 것이 Sweep 이다.

    NOTE: String은 불변타입이기 때문에 연산작업(+“추가”)들어오면 연산결과를 합친 String이 다시 Heap에 할당된다.

10. Inner 클래스

  • 클래스 내부에 선언한 클래스를 말하며 중첩클래스로도 불린다. 클래스 파일을 줄이는 용도, 응집도를 위해서 사용한다.(바깥클래스의 인스턴스변수 사용가능)
  • 종류로는 인스턴스, 스테틱, 메서드(지역), 익명 총 4가지가 있다.
  • 인스턴스 : static 없이 내부에 선언된 class / 외부에서 접근시 상위 클래스의 객체를 만들어서 접근
  • 스테틱 : static 키워드로 선언된 class / 외부에서 접근시 상위클래스.클래스로 접근
  • 메서드 : 메서드 내부에 선언된 class
  • 익명 : 이름없이 선언하는 class / 인터페이스를 파라미터로 구현할 필요가 있는 경우 이름없이 선언하여 그 내부에서 선언하는 것을 의미한다.

11. static

  • 객체를 생성하지 않고도 사용할 수 있는 필드와 메서드, 내부 클래스를 생성하는 키워드를 의미한다.
  • 객체에 소속되는게 아닌 클래스에 소속되는 멤버가 되므로 클래스 멤버라고도 불리며 클래스가 메모리로 올라갈때 같이 할당된다.
  • non-static과 생명주기를 같이하지 않기 때문에 static에서 non-static으로 접근할 수 없다.
  • 인스턴스가 생성되지 않았을경우도 있기 떄문에 오류를 통해 참조를 방지한다.
  • static 메서드에서는 this를 사용할 수 없다.

12. Iterator

  • 컬렉션에 저장된 요소를 순차적으로 읽어 오는 역할을 한다
  • 컬렉션의 종류와 상관없이 동일한 방식을 유지할수 있고 참조클래스를 확인할 필요가 없기 때문에 사용한다.

13. 제네릭

  • 자바 5버전부터 지원하는 컬렉션의 타입을 확인하는 기능
  • 같은 기능이지만 타입에 따라 중복으로 선언해야 되는 문제가 발생한다.
  • 코드레벨에서 타입 검사를 하는게 아닌 컴파일 과정에서 하므로 유연&안정의 장점이 있다.

14. String, StringBuilder, StringBuffer 차이

  • String은 불변객체기 때문에 수정 작업이 발생할 경우 새로운 객체가 만들어져서 메모리 낭비가 있을 수 있다.
  • StringBuilder는 멀티쓰레드 환경에서 동기화를 지원하고 StringBuffer는 지원하지 않는다.

15. 인터페이스

  • 제품을 만들때 필요한 기능들의 목록만 나열한 설계서 같은 것이다.

    가. 자바8 추가사항

    • 디폴트메서드와 static 메서드 선언이 가능해졌다. 디폴트메서드는 객체를 통해 접근하고 static은 바로 접근 가능하다.
    • 디폴트메서드가 생긴 것은 인터페이스에 새로운 메서드를 추가할때 필요하지 않은 클래스들에서도 구현을 해야하는 문제점이 줄어든다.
    • 또한 모든 구현하는 클래스에서 같은 동작을 하는 것이라면 여러번 구현할 필요가 없다.

16. 리터럴, 상수, 배열

  • 리터럴은 변수의 값이 변하지 않는 데이터를 의미한다.(1, 1.0, abc)
  • 일반적인 객체는 리터럴이 될 수 없다.(내부값이 변할 수 있으니) 하지만 객체리터럴은 String 같은 불변클래스로 생성된 객체를 의미한다.
  • 상수는 값은 한번 저장하면 변경할 수 없는 변수를 의미한다.
  • 배열은 여러 변수를 하나로 묶어 물리적으로 연속적인 메모리에 데이터를 저장하는 구조이다.
  • 메모리를 식별하기 위해 시작주소부터 얼마나 떨어져 있는지를 나타내는 오프셋을 사용한다.

17. C와 C++과 Java의 차이

  • C++은 다중상속을 지원하지만 Java는 지원하지 않는다.(단일상속만 사용)
  • Java는 가비지컬렉터가 자동으로 메모리 해제 & JVM위에서 동작한다.

18. JDK와 JRE

  • JDK(Java Development Kit)은 자바 개발에 필요한 JVM, 라이브러리 API, 컴파일 등 개발도구가 포함
  • JRE(Java Runtime Environment)은 프로그램 실행에 필요한 JVM, 라이브러리 API가 포함
  • JDK안에도 JRE가 존재하지만 애플릿 개발할려면 JRE가 필요하다.

19. 변수

  • 프로그램은 처리과정에서 데이터를 메모리에 저장한다.
  • 이때 변수를 사용하는데 변수는 메모리의 공간을 의미한다.

20. 아스키코드, 유니코드, UTF-8

  • 인코딩이란 기계가 이해할 수 있는 언어로 바꾸는 것이다.
  • 아스키코드는 영문, 기호, 숫자 등 128개의 문자를 7비트 이진수로 나타낸 표준이다.
  • 유니코드는 전세계의 언어를 표현

21. String

  • 자바의 경우 문자열 리터럴이 같을 경우 객체를 공유한다. (string constant pool,A==B true)
  • new 를 사용하여 선언할 경우는 각각의 문자열 객체를 생성한다. (A==B false)

22. 접근제어자

  • 외부객체에서 접근시 변수, 메서드 제한범위를 두는 표현식을 의미한다.
  • 외부객체에서 메서드로 호출하기 때문에 내부로직이 어떻게 처리되는지 모르게 된다.
  • 권한을 구분, 유효성을 검사할 수 있는 장점이 있다.
  • protected는 상속받아 자식클래스가 된경우 접근이 가능하다.(같은패키지는 직접가능)

23. Try-With-Resources

  • 자바7부터 추가된 기능으로 try에 괄호를 만들어 그안에 자원을 선언하면 자동으로 try-catch 끝나면 할당을 해제한다.

24. 컬렉션 프레임워크

  • 프레임워크는 구체적이고 체계화된 API(프로그래밍 접근방식) 제공한다는 의미이다.
  • 컬렉션은 객체들의 집합 or 이들을 담는 컨테이너를 의미한다.
  • 자료구조마다 내부기술의 차이를 모르더라도 사용할 수 있게 표준화된 접근방식을 제공하는 것을 컬렉션 프레임워크라 한다.

25. final

  • 클래스, 메서드, 변수 등 모든 대상에 사용되어 일반적인 의미로 변경할 수 없는 을 가진다.
  • 클래스는 상위클래스가 될 수 없고 메서드는 재정의(오버라이딩)안되며 변수는 변하지 않는 값이 된다.

참고 & 출처

반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기