[Java] 정리

HR·2022년 10월 4일
0

Java

목록 보기
2/3

💡 Java 사용하면서 어려웠던 점, 면접에 나올 것 같은 개념들 위주로 정리
'이것이 자바다' 책을 보고 정리함!
구매 링크

Java의 특징

  1. 이식성이 높은 언어

서로 다른 실행 환경을 가진 시스템 간에 프로그램을 옮겨 실행할 수 있는 것을 말한다.

자바 언어로 개발된 프로그램은 소스 파일을 다시 수정하지 않아도, 자바 실행 환경(JRE: Java Runtime Environment)이 설치되어 있는 모든 운영체제에서 실행이 가능하다.

  1. 객체 지향 언어

프로그램을 개발하는 기법으로 부품에 해당하는 객체들을 먼저 만들고, 이것들을 하나씩 조립 및 연결해서 전체 프로그램을 완성하는 기법을 객체 지향 프로그래밍이라고 한다.

자바는 100% 객체 지향 언어이다.

  1. 메모리를 자동으로 관리

메모리는 자바가 직접 관리한다. 객체 생성 시 자동적으로 메모리 영역을 찾아서 할당하고, 사용이 완료되면 쓰레기 수집기(Garbage Collector)를 실행시켜 자동적으로 사용하지 않는 객체를 제거시킨다.

  1. 다양한 애플리케이션 개발 가능

다양한 운영체제에서 실행되는 프로그램을 개발할 수 있다.

단순 콘솔 프로그램, 서버용 웹 애플리케이션, 모바일용 안드로이드앱까지 개발이 가능하다.

Java관련 용어

Java SE (Standard Edition) - 기본 에디션

Java SE는 자바 프로그램들이 공통적으로 사용하는 자바 가상 기계를 비롯하여 자바 프로그램 개발에 필수적인 도구와 라이브러 API를 정의한다.

Java EE (Enterprise Edition) - 서버용 애플리케이션 개발 에디션

서버용 애플리케이션을 개발하기 위한 도구 및 라이브러리 API를 제공한다.

JDK(Java Development Kit)

Java SE의 표준에 따라 만들어진 구체적인 소프트웨어.

JRE(Java Runtime Environment)

자바가 실제로 동작하는 데 필요한 JVM, 라이브러리, 각종 파일들이 포함되어 있는 버전

JVM(Java Virtual Machine)

운영체제는 자바 프로그램을 바로 실행할 수 없다. 이유는 자바 프로그램이 완전한 기계어가 아닌, 중간 단계의 바이트 코드이기 때문이다.

따라서 이를 해석하고 실행할 수 있는 가상의 운영체제가 필요하다. 이것이 바로 자바 가상 기계, JVM이다. 자바 프로그램을 실행하는 가상의 운영체제 역할을 한다.

이를 사용하여 운영체제와 상관없이 자바 프로그램을 개발할 수 있다.

.java 파일을 작성한다(소스 파일) → 소스 파일을 컴파일러로(javac.exe) 컴파일한다 → .class인 바이트 코드 파일이 생성된다 → 바이트 코드 파일은 JVM구동 명령어에 의해 JVM에서 해석되고 해당 운영체제에 맞게 기계어로 번역된다

이러한 과정을 거치기 때문에 느리다는 단점이 있긴 하다.

하지만 기계어를 빠르게 변환해주는 JVM내부의 최적화된 JIT 컴파일러를 통해 속도의 격차를 줄일 수 있다.

JIT

JIT 컴파일러가 소스 코드 전체를 확인한 후 중복된 부분을 미리 기계어로 번역시켜서 저장해놓는 방식.

이후 인터프리터 방식으로 번역하다가 중복된 부분을 만나게 되면 이미 변환된 기계어 코드를 재사용하게된다.

타입 변환

타입 변환에는 자동(묵시적)변환과 강제(명시적)변환이 존재한다.

  1. 자동(묵시적)변환

자동 타입 변환은 프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것을 말한다.

자동 타입 변환은 작은 크기를 가지는 타입이 큰 크기를 가지는 타입에 저장될 때 발생한다.

int intValue = 200;
double doubleValue = intValue //200.0
  1. 강제 타입 변환(Casting)

큰 데이터 타입을 작은 데이터 타입으로 쪼개어서 저장하는 것을 말한다.

강제 타입 변환은 캐스팅 연산자 ()를 사용하며, 괄호 안에 들어가는 타입은 쪼개는 단위이다.

원래 값이 보존되지 않을 수 있다.

int intValue = 200;
byte byteValue = (byte) intValue;

데이터 타입 분류

자바의 데이터 타입은 크게 기본 타입(원시 타입: primitive type)과 참조 타입(reference type)으로 분류된다.

참조 타입은 객체의 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스 타입을 말한다.

차이점은 저장되는 값이 무엇이냐이다. 기본 타입을 통해 선언된 변수는 실제 값을 변수에 저장하지만, 참조 타입은 메모리의 번지를 값으로 갖는다. 번지를 통해 객체를 참조한다는 뜻에서 참조 타입이라고 부른다.

== != 연산은 변수의 값이 같은지, 아닌지를 조사하고 참조 타입 변수들 간의 연산일 경우 동일한 객체를 참조하는지 알아볼 때 사용한다. 결국 주소 값을 비교한다는 의미가 되고, 동일한 주소 값을 갖고 있다면 동일한 객체를 참조한다는 의미가 된다.

NullPointerException

참조 타입 변수를 잘못 사용하면 발생한다. 참조 타입 변수가 null을 가지고 있을 경우, 해당 에러가 발생한다.

참조 타입

  1. 배열

같은 타입의 데이터를 연속된 공간에 나열시키고, 각 데이터에 인덱스를 부여해 놓은 자료구조를 말한다. 인덱스를 통해 빠르게 데이터에 접근이 가능하다.

  1. 열거 타입

데이터 타입 중에는 몇 가지로 한정된 값만을 가지는 경우가 흔히 있다.

예를 들어 요일에 대한 데이터는 월~일이라는 7개의 값을 가지고, 계절일 경우 봄~겨울 4개의 값을 가진다.

이와 같이 한정된 값만을 갖는 데이터 타입이 열거 타입(Enumeration type)이다.

열거 타입은 몇 개의 열거 상수(enumeration constant) 중에서 하나의 상수를 저장하는 데이터 타입이다.

public enum Week {
	MONDAY, 
	TUESDAY...
}

객체 지향 프로그래밍

객체란 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고, 다른 것과 식별 가능한 것을 말한다.

객체는 속성과 동작으로 구성되어 있다.

현실 세계의 객체를 소프트웨어 객체로 설계하는 것을 객체 모델링이라고 한다.

객체 지향 프로그래밍은 부품에 해당하는 객체들을 만들고, 이것들을 조립하여 완성된 프로그램을 만드는 기법을 말한다. 다음과 같은 특징을 가진다.

  1. 캡슐화(Encapsulation)

객체의 필드, 메소드를 하나로 묶고 실제 구현 내용을 감추는 것을 말한다.

외부 객체는 객체 내부의 구조를 알지 못하며 객체가 노출해서 제공하는 필드와 메소드만 이용이 가능하다.

  1. 상속

상위 객체가 자기가 가지고 있는 필드와 메소드를 하위 객체에게 물려주어 하위 객체가 사용할 수 있도록 해준다.

  1. 다형성

같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질을 말한다.

오버로드, 오버라이딩이 존재한다.

클래스

객체는 갑자기 하늘에서 떨어지는 것이 아니다. 설계도를 바탕으로 만들어진다.

객체 지향 프로그래밍도 마찬가지다. 메모리에서 사용하고 싶은 객체가 있다면, 우선 설계도로 해당 객체를 만드는 작업이 필요하고, 자바에서는 설계도가 바로 클래스이다.

클래스에는 객체를 생성하기 위한 필드와 메소드가 정의되어 있다.

클래스로부터 만들어진 객체를 해당 클래스의 인스턴스라고 한다.

클래스로부터 객체를 만드는 과정을 인스턴스화라고 한다.

new

클래스로부터 객체를 생성시키는 연산자이다.

클래스에는 객체가 가져야 할 구성 멤버가 선언된다. 필드, 생성자, 메소드가 있다. 이는 생략되거나 복수 개 작성될 수 있다.

  1. 필드

객체의 고유 데이터, 부품 객체, 상태 정보를 저장하는 곳.

변수와 비슷하지만, 변수는 생성자와 메소드 내에서만 사용되고 생성자와 메소드가 실행 종료되면 자동 소멸한다.

하지만 필드는 생성자와 메소드 전체에서 사용되며 객체가 소멸되지 않는 한 객체와 함께 존재한다.

초기값이 지정되지 않은 필드들은 자동으로 기본 초기값으로 설정된다.

  1. 생성자

생성자는 new 연산자로 호출되는 특별한 중괄호 블록이다.

생성자의 역할은 객체 생성 시 초기화를 담당한다.

클래스 이름으로 되어 있고 리턴 타입이 없다.

필드를 초기화하거나, 메소드를 호출해서 객체를 사용할 준비를 하는 것을 말한다.

자바는 생성자 오버로딩을 제공한다. 생성자 오버로딩이란 매개 변수를 달리하는 생성자를 여러 개 선언하는 것을 말한다.

오버로딩 같은 이름을 가지는 메소드를 여러 개 두는 것

오버라이딩 상위 클래스로 물려받은 자식 클래스에서 메소드를 재정의 하는 것

  1. 메소드

객체의 동작을 담당한다.

객체 간의 데이터 전달의 수단으로 사용된다.

this 객체 내부에서 인스턴스 멤버에 접근하기 위해 사용하는 키워드. 보통 인스턴스 멤버인 필드임을 명시하고자 할 때 사용한다.

정적 멤버와 static

정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말한다. 이들을 각각 정적 필드, 정적 메소드라고 부른다. 정적 멤버는 클래스에 소속된 멤버이기 때문에 클래스 멤버라고도 한다.

static 키워드를 사용하여 정적 필드와 정적 메소드를 선언할 수 있다.

객체마다 가지고 있을 필요성이 없는 공용적인 데이터일 경우에 정적 필드로 선언하는 것이 좋다.

final 필드와 상수

final 필드는 초기값이 저장되면 이것이 최종적인 값이 되어서 프로그램 실행 도중에 수정할 수 없다는 것을 말한다.

final 타입 필드 [= 초기값];

일반적으로 불변의 값을 상수라고 부른다. 하지만 final 필드를 상수라고 부르진 않는다.

객체마다 저장될 필요가 없는 공용성을 띄우기에, 상수는 static이면서 final이어야 한다.

static final 필드는 객체마다 저장되지 않고, 클래스에만 포함된다. 그리고 한 번 초기값이 저장되면 변경할 수 없다.

static final 타입 상수 [= 초기값];

패키지

우리가 폴더를 만들어 파일을 저장 관리하듯이 패키지를 만들어 클래스를 저장 관리한다.

패키지는 클래스를 유일하게 만들어주는 식별자 역할을 한다.

default public을 생략했을 경우 클래스는 default 접근 제한을 가진다. 같은 패키지에서는 아무런 제한 없이 사용이 가능하고, 다른 패키지에서는 사용할 수 없도록 제한된다.

어노테이션

어노테이션은 메타데이터라고 볼 수 있다. 메타데이터란 애플리케이션이 처리해야 할 데이터가 아니라, 컴파일 과정과 실행 과정에서 코드를 어떻게 컴파일하고 처리할 것인지를 알려주는 정보이다.

다음과 같은 세 가지 용도로 사용된다.

  1. 컴팡이러에게 코드 문법 에러를 체크하도록 정보를 제공
  2. 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보를 제공
  3. 실행 시(런타임 시) 특정 기능을 실행하도록 정보를 제공

상속

상속은 이미 잘 개발된 클래스를 재사용해서 새로운 클래스를 만들기 때문에 코드의 중복을 줄여준다.

어떤 부모 클래스를 상속받을 것인지 결정하고 extends 뒤에 기술한다.

다중 상속을 허용하지 않는다.

메소드 오버라이딩이란 자식 클래스에서 상속받은 메소드를 재정의하는 것을 말한다.

super 부모 클래스의 메소드를 호출해야 하는 경우 명시적으로 super 키워드를 붙여서 사용한다.

final 클래스는 부모 클래스가 될 수 없어 자식 클래스를 만들 수 없다.

다형성 은 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질을 말한다.

instanceof 어떤 객체가 어떤 클래스의 인스턴스인지 확인하는 메소드

추상 클래스

추상(abstract)은 실체 간에 공통되는 특성을 추출한 것을 말한다.

예를 들어 새, 곤충, 물고기 등은 동물이라는 공통점을 가진다.

클래스에서도 추상 클래스가 존재한다. 객체를 직접 생성할 수 있는 클래스를 실체 클래스라고 하면, 공통적인 특성을 추출해서 선언한 클래스를 추상 클래스라고 한다. 둘은 상속의 관계를 가진다.

추상 클래스가 부모이고, 실체 클래스가 자식으로 구현되어 실체 클래스는 추상 클래스의 모든 특성을 물려받고, 추가적인 특성을 가질 수 있다.

다음과 같은 이유로 추상 클래스를 만든다.

  1. 실체 클래스등릐 공통된 필드와 메소드의 이름을 통일할 목적
  2. 실체 클래스를 작성할 때 시간을 절약 → 공통적인 필드와 메소드는 추상 클래스에 선언하고, 실체 클래스에서는 다른 점만 작성하면 되기 때문에 시간을 절약할 수 있다.

abstract 키워드를 사용하여 추상 클래스를 선언한다.

인터페이스

인터페이스란 다른 클래스를 작성할 때 기본이 되는 틀을 제공하고, 객체 사이에서 일언는 상호 작용의 매개체이다.

자바에서 인터페이스는 객체의 사용 방법을 정의한 타입이다.

인터페이스는 상수와 메소드만을 구성 멤버로 가진다. 생성자를 가질 수 없다.

추상 메소드는 객체가 가지고 있는 메소드를 설명한 것으로, 호출할 때 어떤 매개값이 필요하고 리턴 타입이 무엇인지 알려준다. 실제 실행부는 구현 객체가 가지고 있다.

implements 키워드를 통해 구현을 진행한다. 이 때 인터페이스가 가지고 있는 메소드를 구현해야한다.

예외 처리

예외는 두 가지 종류가 있다. 하나는 일반 예외(Exception)이고 다른 하나는 실행 예외(Runtime Exception)이다. 일반 예외는 컴파일러 체크 예외라고도 하는데, 자바 소스를 컴파일하는 과정에서 예외 처리 코드가 필요한지 검사하기 때문이다.

예외 처리 코드는 try-catch-finally 블록을 사용한다.

try 블록에는 예외 발생 가능 코드가 위치한다. try에서 예외가 발생할 경우 catch 블록으로 이동하여 예외 처리 코드를 실행하고, finally는 항상 실행이 된다.

주의할 점은 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야 한다. catch블록은 위에서부터 차례대로 검색하기 때문이다.

경우에 따라 메소드를 호출한 곳으로 예외를 떠넘길 수도 있다. 이 때 throws 키워드를 사용한다. 메소드 선언부 끝에 작성되어 메소드에서 처리하지 않는 예외를 호출한 곳으로 떠넘기는 역할을 한다.

String 관련

String String 클래스의 인스턴스로 관리된다. 문자열을 저장하기 위해 사용한다.

StringTokenizer 구분자를 기준으로 부분 문자열을 분리하기 위해 사용한다. split()은 정규 표현식으로 구분하고, StringTokenizer는 문자로 구분한다는 차이점이 있다.

StringBuffer 멀티 스레드 환경에서 사용할 수 있도록 동기화가 적용되어 있어 스레드에 안전하다.

StringBuilder 단일 스레드 환경에서만 사용하도록 설계되어 있다.

둘 다 문자열을 변경하는 작업이 많을 경우에 사용하는 클래스이다. 두 클래스는 내부 버퍼(데이터를 임시로 저장하는 메모리)에 문자열을 저장해 두고 그 안에서 추가, 수정, 삭제 작업을 할 수 있도록 설계되어 있다.

profile
Hello World :D

0개의 댓글