[java] 자바 웹개발 기술면접 정리

2021. 9. 1. 16:22

기본 자바 지식

  • jvm의 역할 : 자바를 실행하기 위한 가상 기계이다.Java 코드를 OS에 맞게 해석해주는 역할을 한다
  • 자바 프로그램은 완전한 기계어가 아니기 때문에 jvm(자바 가상기계)가 해석하고 실행해줌 = 가상운영체제
  • jdk와 jre 차이 : 둘다 jvm과 라이브러리api가 들어있는데 jdk는 개발에 필요한 컴파일러 등의 개발 도구가 포함 되어 jre는 실행할수만있다
  • 자바 구동 순서 : .java생성 → 컴파일러로 .class파일 생성 → jvm으로 클래스 파일 메모리에 로드 → jvm이 main()메소드 찾아 실행
  • 자바 장점 - 객체지향언어이다, 이식성이좋다(jvm이 운영체제에 독립적이다) , 다양한 오픈소스라이브러리를 가지고 있다 등

클래스블록과 메인블록 메소드블록으로 구성

  • 클래스 : 필드 또는 메소드를 포함하는 블록
  • 메소드 : 어떤 일을 처리하는 실행문들을 모아 놓은 블록
  • 변수 : 하나의 값을 저장할 수 있는 메모리 공간 변수는 선언된 중괄호 안에서만 사용 가능하다. 선언 시 사용한 타입의 값만 저장할 수 있다.(소스코드내에서 직접 입력 된 값 = 리터럴)
  • 리터럴 : 변수에 저장되는 값
  • 원시타입 vs 참조타입

원시타입 : 정수, 실수, 문자, 논리 리터럴을 직접 저장하는 타입 → stack에 저장

참조타입 : 원시타입을 제외한 모든 것 → heap에 저장

  • 타입변환

자동 타입 변환 : 작은거에서 큰거 (손실정보X)

강제 타입 변환 : 큰거에서 작은거 (정보손실) = casting

 


Java 메모리 사용 영역

  • 메소드 영역 : 코드에서 사용되는 클래스(.class)들을 클래스 로더로 읽어 클래스별로 런타임상수풀, 필드 데이터, 메소드데이터, 메소드코드, 생성자 코드 등을 분류해서 저장 jvm이 시작할 때 생성되고 모든 스레드가 공유하는 영역
  • 힙 영역 : 객체와 배열이 생성되는 영역. 힙 영역에 생성된 객체와 배열은 JVM 스택 영역의 변수 나 다른 객체의 필드에서 참조한다.
  • 가비지 컬렉션에 의해 메모리가 관리됨 & new 연산자를 통해 동적할당된 객체들 저장
  • JVM 스택 영역: JVM 스택 영역은 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당된다. 자바 프로그램에서 추가적으로 스래드를 생성하지 않았다면 main스레드만 존재하므로 JVM 스택도 하나이다. JVM 스택은 메소드를 호출할 때마다 프레임을 추가하고 메소드가 종료되면 해당 프레임을 제거하는 동작을 수행한다. 예외 발생 시 printStackTrace() 메소드
  • 지역변수, 함수 등이 할당되는 LIFO방식의 메모리

기본 타입 변수는 스택 영역에 직접 값을 가지고 있지만, 참조 타입 변수는 값이 아니라 힙 영역이나 메소드 영역의 객체 주소를 가진다

int a = 1; —> stack [ a | 1 ] //기본타입변수 int[] scores = {1,2,3} —> stack [scores | 5번지] —> heap 5번지 [1,2,3] // 참조타입변수

 


String 타입

문자열은 String이라는 객체를 생성하고 변수는 String 객체를 참조한다.

자바는 문자열 리터럴이 동일하다면 String 객체를 공유하도록 되어 있다.

new연산자로 생성할 경우 새로운 객체로 생성된다.

 

String name1 = "보연"; 
String name2 = "보연"; // name1과 같은 주소값가짐
String name3 = new String("보연") //name1,name2와 다른 주소 값 가짐

String은 불변성이라는 특징 때문에 수정을 하지못하고 새로운 String 객체를 생성하게 되고 원래 있던 객체는 가비지콜렉터에 의해 제거되어 좋은 성능을 기대할 수 없다.

 

따라서 StringBuilder나 StringBuffer을 사용한다. StringBuffer는 동기화를 지원하여 멀티쓰레드 환경에서 안전하다. 하지만 StringBuilder는 동기화를 지원하지 않기때문에 단일쓰레드 환경에서 사용한다. 단일쓰레드의 환경은 StringBuffer보다 뛰어나다.

 


객체 지향 프로그래밍

  • 객체 : 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른 것과 식별 가능한 것을 뜻함. 현실 객체를 소프트웨어 객체로 설계하는 것을 모델링이라 한다. 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스라고한다.
  • 인스턴스화 : 클래스로부터 객체를 만드는 과정을 인스턴스화라고한다.
  • 메소드 호출 : 객체가 다른 객체의 기능을 이용하는 것
  • 매개값 : 메소드를 실행하기 위해 필요한 데이터
  • 객체지향프로그래밍의 특징:
    1. 캡슐화 : 객체의 필드, 메소드를 하나로 묶고, 실제 구현 내용을 감추는 것. 외부 객체는 객체 내부의 구조를 알지 못하며 객체가 노출해서 제공하는 필드와 메소드만 이용할 수 있다.
    외부의 잘못된 사용으로 객체가 손상되지 않도록 한다.
    1. 상속 : 상위 객체가 가지고 있는 필드와 메소드를 하위 객체에게 물려주어 하위 객체가 사용할 수 있도록 함. 상위 객체를 재사용해서 하위 객체를 쉽고 빨리 설계할 수 있도록 도와주고, 이미 잘 개발된 객체를 재사용해서 새로운 객체를 만들기 때문에 반복된 코드의 사용을 줄여준다. 또한, 코드 수정 시 상위객체만 수정하면 되기 때문에 유지보수에 용이하다.
    2. 다형성 : 하나의 타입에 여러 객체를 대입하여 다양한 기능을 이용할 수 있도록 함
    3. 자바는 다형성을 위해 부모 클래스 또는 인터페이스의 타입 변환을 허용한다.
  • 캡슐화된 멤버를 노출시킬 것인지, 숨길 것인지를 결정하기 위해 접근 제한자를 사용한다.
  • Getter와 Setter : 객체의 무결성을 위해 데이터를 외부에서 직접 접근하는 것을 막고 메소드를 통해 데이터를 변경하게 하는 것. 메소드는 매개값을 검증해서 유효한 값만 데이터로 저장하게끔 한다.

클래스의 구성 멤버

  • 필드 : 객체의 고유 데이터, 부품 객체, 상태 정보를 저장하는 곳. 변수는 생성자와 메소드 내에서만 사용되기 때문에 메소드가 실행 종료되면 자동 소멸되지만. 필드는 객체가 소멸되지 않는 한 계속 존재
  • 생성자 : new 연산자로 호출되는 특별한 중괄호 {} 블록. 생성자의 역할은 객체 생성 시 초기화를 담당. 클래스 이름으로 되어 있고 리턴 타입이 없다.
  • 메소드 : 객체의 동작에 해당하는 중괄호{}블록을 말한다.
  • 기본 생성자 : 모든 클래스는 생성자가 반드시 존재하며 하나 이상을 가질 수 있다.

 

//생성자 명시적 선언 X 
public class Car { 
	public Car() { 
    } 
} 
Car myCar = new Car(); // (O) 

//생성자 명시적으로 선언O 
public class Car { 
	public Car(String color, int cc) { 
    } 
}

Car myCar = new Car("검정", 3000); // (O) 
Car myCar = new Car(); // (X)
  • 생성자 오버로딩 : 매개 변수를 달리하는 생성자를 여러 개 선언
  • 인스턴스 멤버: 객체를 생성한 후 사용할 수 있는 필드와 메소드 이들을 각각 인스턴스 필드, 인스턴스 메소드라고 부름
  • this : 객체 내부에서 인스턴스 멤버에 접근하기 위해 this를 사용할 수 있다.
  • 클래스에 생성자가 명시적으로 선언되어 있을 경우 반드시 선언된 생성자를 호출해서 객체를 생성해야한다.
  • 클래스 외부에서 new연산자를 이용해 만들 수 없다 → private 접근 제한자를 붙힌다.
  • final : 초기값이 저장되면 최종값이 되어 프로그램 실행 중 값을 변경할 수 없다.
  • 상수(static final) : 객체마다 저장할 필요가 없는 공용성을 띄면서 변하지 않는 값

정적(Static)

  • 정적 멤버 : static은 고정된이란 의미를 가진다. 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말한다.메모리 할당을 한번만 해도 되고 같은 주소만 바라보기 때문에 메모리 사용과 공유면에서 효율적이다https://wikidocs.net/228
  • 객체가 없어도 실행되기 때문에 인스턴스 멤버를 사용할 수 없고 사용하기 위해서는 내부에서 객체를 생성해야한다.
  • 객체마다 가지고 있지 않아도 되는 공용 데이터라면 static으로 구성하는 것이 좋다.

접근제한자

  1. public : 외부 클래스가 자유롭게 이용 가능
  2. protected : 같은 패키지이거나 자식 클래스에서 사용 가능
  3. private : 외부에서 접근 불가능
  4. default: 위 3가지가 적용되지 않을 때 자동 적용. 같은 패키지 내에서 접근 가능

어노테이션

  • 일종의 메타데이터. 메타데이터란 애플리케이션에서 처리해야 할 데이터가 아닌 컴파일 과정 혹은 실행 과정에서 코드를 어떻게 컴파일하고 처리할 것인지 알려주는 정보.
    1. 컴파일러에게 코드 문법 에러를 체크하도록 정보 제공
    2. 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동 생성할 수 있도록 정보 제공
    3. 실행 시(런타임) 특정 기능을 실행하도록 정보 제공 (클래스역할정의)
    클래스, 필드, 메소드에만 적용O 생성자에는 적용X

객체와 클래스 차이

  • 클래스 : 실체 객체의 속성과 동작을 필드와 메소드로 정의해놓고 아직 메모리에 할당되지 않은 상태
  • 객체 : 설계된 class를 기반으로 실제 메모리가 잡힌 것을 의미

 

상속

  • super.부모메소드() : 자식 클래스에서 부모 클래스의 메소드를 오버라딩하게 되면 부모 클래스의 메소드가 숨겨진다. 이때 숨겨진 메소드를 사용하고할때 super을 붙혀서 사용
  • final 메소드는 오버라이딩할수없다

 

추상클래스

  • 개념 : 객체를 직접 생성할 수 있는 클래스를 실체 클래스라고 하는데 이 클래스들의 공통적인 특성을 추출해서 선언한 클래스를 추상 클래스라고 한다.
  • 추상 메소드가 없거나 하나 이상 갖고있다.
  • 실체 클래스는 추상 클래스를 상속받아 추상 클래스의 모든 특성을 물려받는다.
  • 추상클래스는 new연산자를 사용해 인스턴스를 생성시키지 못한다.
  • 용도:
    1. 실체 클래스들의 공통된 필드와 메소드의 이름을 통일할 목적
    2. 실체 클래스를 작성할 때 시간을 절약

인터페이스

  • 개념 : 객체의 사용 방법을 정의 객체들의 동일한 기능을 수행하게끔 하는것
  • 자바의 다형성을 극대화하여 개발코드 수정을 줄이고 프로그램 유지보수성을 높인다.
  • 생성자를 가질 수 없다
  • 모든 메소드가 추상 메소드이다.
  • 인터페이스를 구현한 객체들에 대해 동일한 동작을 약속
  • 인터페이스 사용 이유 : 팀작업시 개발코드 부분과 객체가 서로 통신하는 접점 역할을 지원하여 개발코드에서 객체의 내부 구조를 모르더라도 인터페이스의 메서드 명만 알고 있으면 된다.

추상클래스 vs 인터페이스

http://alecture.blogspot.com/2011/05/abstract-class-interface.html

추상 클래스는 추상 클래스를 상속받아 기능을 이용하고 확장시키는데 있다.

반면에 인터페이스는 함수의 껍데기만 있어 함수의 구현을 강제시킨다.

구현을 강제시킴으로써 구현 객체의 같은 동작을 보장한다.

다중 상속은 불가능하지만 인터페이스는 여러개를 구현 할수있다.

 


Wrapper Class사용

기본 data 타입은 객체가 아니기 때문에 Object로 받는 다형성을 지원할 수가 없다. 하지만 메서드에서 실제로 기본데이터 타입을 다형성으로 넘겨주어야 하는 경우가 빈번히 발생한다. 이때 기본 데이터 타입을 객체로 변환시켜 전달하기 위해 사용된다.

박싱 : 원시형을 Wrapper Class로 변환

언박싱 : Wrapper Class를 원시형으로 변환

 

 


제네릭

클래스를 선언할 때 타입을 결정하지 않고 객체를 생성할 떄 유동적인 타입으로 재사용하는 것

형변환을 할 필요없고, 타입 에러가 발생할 확률이 없어진다.

 


자바프로그래밍 언어 플랫폼

  1. 표준 에디션의 자바 플랫폼 (Java SE)
  2. 엔터프라이즈 에디션의 자바 플랫폼 (Java EE)
  3. 마이크로 에디션의 자바 플랫폼 (Java ME)
  4. JavaFX
  • 모든 자바 플랫폼들은 자바 가상 머신(JVM)과 어플리케이션 프로그래밍 인터페이스(API)로 구성되어 있다.
    • 자바 가상 머신(JVM): 하드웨어와 소프트웨어 플랫폼에서 자바 기술을 사용한 어플리케이션을 동작시키기위한 프로그램
    • 어플리케이션 프로그래밍 인터페이스(API): 개발자들이 직접 컴포넌트나 어플리케이션을 만들 때 사용할 수 있는 소프트웨어 컴포넌트의 집합
  • 각각의 자바 플랫폼에서는 JVM과 API를 제공함으로써 타겟 플랫폼상에서 동작되도록 작성된 어플리케이션들이 자바 프로그래밍 언어의 장점(플랫폼에 비종속적, 안정성, 개발 용이 등)들을 그대로 갖출 수 있게 한다.

Java SE (Standard Edition)

  • 가장 대중적인 자바 플랫폼
  • 흔히 자바 언어라고하는 대부분의 패키지가 포함된 에디션
    • java.lang.*, java.util.*, java.awt.*, javax.rmi.*, javax.net.* 등
  • Java SE의 API는 자바 프로그래밍 언어의 핵심기능들을 제공
    • 기초적인 타입
    • 네트워킹
    • 보안
    • 데이터베이스 처리
    • 그래픽 사용자 인터페이스 개발
    • XML 파싱
  • 가상머신, 개발도구, 배포기술, 부가 클래스 라이브러리, 툴킷 등 제공

Java EE (Enterprise Edition)

  • Java EE 플랫폼은 Java SE 플랫폼을 기반으로 그 위에 탑재된다.
  • 웹 프로그래밍에 필요한 기능을 다수 포함
    • JSP, Servlet, JDBC, JNDI, JTA, EJB 등
  • 대규모, 다계층, 확장성, 신뢰성, 보안 네트워킹 API, 환경 등을 제공

BELATED ARTICLES

more