[신입 CS 질문] 자바

박의진·2023년 7월 31일
0

CS

목록 보기
4/8

JAVA

자바의 특징

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

객체지향 프로그래밍(OOP)

  • 객체들의 집합으로 프로그램의 상호 작용을 표현
  • 데이터를 객체로 취급하여 객체 내부에 선언된 메소드를 활용하는 방식
  • 설계에 많은 시간이 소요되고 처리 속도가 느림

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

추상화

  • 핵심적인 개념 또는 기능을 간추려 내는 것

캡슐화

  • 객체의 속성과 메서드를 하나로 묶고 일부를 외부에 감추어 은닉

다형성

  • 상위 클래스가 동일한 메시지로 하위 클래스들을 서로 다르게 동작시키는 객체 지향 원리
  • 오버로딩
  • 오버라이딩

상속성

  • 상위 클래스의 특성을 하위클래스가 이어받아 재사용하거나 확정하는 것

오버로딩과 오버라이딩

오버로딩

  • 같은 이름을 가진 메서드를 여러개 두는것을 말함.
  • 메서드의 타입, 매개변수의 유형, 개수 등이 달라짐
  • 컴파일 중에 발생하는 정적 다형성

오버라이딩

  • 상위 클래스로부터 상속받은 메서드를 하위클래스에서 재 정의하여 사용하는 것
  • 런타임 중에 발생하는 동적 다형성

OOP의 장점과 단점

장점

  • 코드 재사용 용이
  • 유지보수 용이
  • 생산성 향상

단점

  • 실행속도 저하
  • 설계에 소요가 많음

OOP 5가지 설계 원칙

단일책임원칙

  • 하나의 클래스는 하나의 책임만 가진다.

개방-폐쇠원칙

  • 확장에는 열려있고 변경에는 닫혀있다.

리스코프치환원칙

  • 프로그램의 정확성을 깨드리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 함

인터페이스분리원칙

  • 일반적인 인터페이스 보다는 구체적인 여러개의 인터페이스를 만들어야 함

의존 역전 원칙

  • 추상화된 인터페이스나 상위클래스를 두어 변하기 쉬운것의 변화에 영향을 받지 않게 하는 원칙

자바의 장점

  • JVM위에서 동작하기 때문에 운영체제에 독립적이다.
  • 가비지 컬렉터를 통해서 자동적인 메모리 관리가 가능

자바 단점

  • JVM 위에서 동작하기 때문에 실행속도가 상대적으로 느림
  • 다중 상속이나 타입에 엄격하며, 제약이많음

자바 JVM 역할 설명

  • JVM은 스택 기반으로 동작하며 자바 바이트 코드를 OS에 맞게 해석해주는 역할을하며 가비지 컬렉션을 통해 자동적인 메모리 관리를 해줌

자바 컴파일 과정

  • .java 파일 생성
  • 빌드
  • 컴파일러를 통해 바이트 코드를 생성
  • 클래스 로더를 통해 JVM 메모리 내로 로드
  • 실행 엔진을 통해 각 운영체제에 맞는 기계어로 해석

생성자

  • 클래스와 같은 이름의 메서드로, 새 객체가 생성될 때 호출되는 메서드
  • 파라미터를 다르게 해 오버로딩 할 수 있음

자바 원시 타입과 각 몇 바이트를 차지하나?

  • 정수형 byte(1), short(2), int(4), long(8)
  • 실수형 float(4), double(8)
  • 문자형 char (2)
  • 논리형 boolean (1)

지역변수

  • 메서드 안에서 정의되어 메서드 안의 스코프에서만 존재

인스턴스변수

  • 클래스에서 정의되어 클래스 전체의 스코프 안에서 존재
  • 필드라고 생각하면 됨

객체

  • 클래스를 기반으로 생성되는 데이터

인스턴스

  • 객체에 메모리가 할당되어 실제로 활용되는 실체

클래스란?

  • 클래스는 객체를 만들기 위한 틀 혹은 설계도

메소드란?

  • 클래스에 종속되어 인스턴스와 연결되어 있는 어떤 특정 작업을 수행하기 위한 명령문의 집합

불변 객체란?

  • 객체 생성 이후 내부의 상태가 변하지 않는 객체
  • 자바에서는 필드가 원시타입일 경우 final을 사용해 불변 객체를 만들수 있음

참조 타입

  • 객체 참조
  • 배열
  • 리스트

불변 객체나 final을 사용해야하는 이유?

  • 메소드 호출 시 파라미터 값이 변하지 않는 것을 보장
  • 부수효과를(변수의 값이 변함)피해 오류 최소화

상속

  • 자식 클래스가 부모 클래스의 메서드 등을 상속받아 사용
  • 자식 클래스에서 추가 및 확장을 할 수 있는 것
  • 재사용성, 중복성의 최소화

구현

  • 부모 인터페이스를 자식 클래스에서 재정의하여 구현
  • 상속과는 달리 반드시 부모 클래스의 메서드를 재 정의 해야함

추상클래스

  • 클래스 안에 추상메서드가 하나 이상 포함되거나 abstract로 정의된 경우
  • 상속 받아서 기능을 이용하고 확장할 수 있음
  • static이나 final이 아닌 필드를 가질 수 있음
  • 일반 변수, 메서드를 가질 수 있음
  • 인스턴스를 생성할 수 없음
  • 다중 상속 불가능함

인터페이스

  • 모든 메소드가 추상 메소드로만 이루어져 있는 것을 말함
  • 상수(static final)와 추상메서드의 집합
  • 추상 클래스와 다르게 구현부가 있는 일반 메소드와, 일반 멤버 변수를 가질 수 없음
  • 다중 구현이 가능
  • 인스턴스를 생성할 수 없음
  • 상속받은 클래스는 반드시 추상 메서드를 구현해야 한다.

공통점

  • new 연산자로 인스턴스 생성 불가능
  • 사용하기 위해서는 하위 클래스에서 확장/구현 해야 한다.

차이점

  • 인터페이스는 그 인터페이스를 구현하는 모든 클래스에 대해 특정한 메소드가 반드시 존재하도록 강제함

출처 https://code-lab1.tistory.com/287

Call by value

  • 값에 의한 호출
  • 함수 호출 시 전달되는 변수의 값을 복사하여 함수의 인자로 전달
  • 복사된 인자는 함수의 지역변수로 사용

call by reference

  • 참조에의한 호출
  • 함수 호출시 인자로 전달되는 변수의 레퍼런스를 전달
  • 함수 안에서 인자의 값이 변경되면,함수 호출시에 있던 변수들도 값이 변함

자바의 경우 데이터 타입에 따라서 함수 호출 방식이 달라짐

  1. 기본형 : call by value (int, short, long, double, boolean, char)
  2. 참조형 : call by reference (Array, Class instace, String)

불변객체 STRING

  • 한번 값이 할당되면 변하지 않음 (불변)
  • 값을 변화시킬 때, heap에 새로운 메모리를 사용하고, 참조되는 주소만을 바꿔줌

String이 불변인 이유

  • 강제로 참조에 대한 문자열 값을 변경하는 것이 불가능해서 보안에 유리
  • 여러 스레드에서 동시에 특정 객체를 참조하더라도 안전함

STRING/ STRING BUILDER / STRING BUFFER

STRING

  • 한번 값이 할당되면 변하지 않음 (불변)
  • 값을 변화시킬 때, heap에 새로운 메모리를 사용하고, 참조되는 주소만을 바꿔줌
  • 불변이라는 특징으로 인해 이를 해결하기위해 string builder, string buffer 클래스 사용

STRING BUILDER 클래스

  • 문자열을 더할 때 새 객체를 생성하는 것이 아니라 기존 문자열에 더하는 형식이라 속도가 빠름

  • 동기화를 지원하지 않기에 멀티 스레드 환경에서 사용하는 것은 적합하지 않음

  • 단일스레드에서는 String buffer보다 성능이 뛰어남

STRING BUFFER 클래스

  • 내부에 독립적인 버퍼를 가지며 16개의 문자를 저장할 수 있음

  • 문자열을 기존 문자열에 더해 추가할 수 있으며 공간 낭비 없이 속도도 빠르다.

  • 동기화를 지원하여 멀티 스레드 환경에서 안전

가비지 컬렉터

  • 더 이상 참조되지 않는 메모리/ 객체를 정리해주는 역할
  • HEAP 영역 위주로 탐색하여 메모리를 정리해 줌

제네릭

  • 타입을 일반화하는 것으로 클래스 내부에서 정하는 것이 아닌 사용자 호출에 의해서 결정하는 것
  • 재사용성 증가/ 컴파일 시 에러 발견 가능

자바 메모리 영역

METHOD

  • 전역변수와 static변수를 저장하며, 메소드 영역은 프로그램의 시작부터 종료까지 메모리에 남아있음
  • JVM이 동작해서 클래스가 로딩될 때 생성

HEAP

  • 동적 할당할 때,인스턴스, 배열 등이 힙 영역에 저장
  • 가비지컬렉션에 의해 메모리가 관리됨
  • 런타임 당시 할당

STACK

  • 메소드 호출 정보, 지역변수, 매개변수들이 저장되는 공간
  • 메소드가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제
  • 컴파일 당시 할당
  • 스택영역은 동적으로 크기가 늘어날 수 있기에 힙과 영역이 겹치면 안돼서 힙과 스택 사이에 공간을 비워 둠

Wrapper class

  • 기본 자료형에 대한 객체 표현
  • 기본 자료형을 래퍼 클래스로 변환하는 것을 박싱
  • 래퍼 클래스에서 기본 자료형으로 변환하는 것을 언박싱

new String()과 리터럴("") 차이

  • new String()은 new 키워드로 새로운 객체를 생성하기 때문에 Heap 메모리 영역에 저장
  • 리터럴은 heap 안에 있는 String Pool 영역에 저장

참조 = https://dev-coco.tistory.com/153

접근 제한자

  • 변수 또는 메소드의 접근 범위를 설정해주기 위해서 사용
  • public 접근 제한이 없다. (같은 프로젝트 내 어디서든 사용 가능)
  • protected 해당 패키지 내, 다른 패키지에서 상속받아 자손 클래스에서 접근 가능하다.
  • default 해당 패키지 내에서만 접근 가능
  • private 해당 클래스에서만 접근 가능

클래스 멤버 변수 초기화 순서

  • static 변수 선언부 : 클래스가 로드 될 때 변수가 제일 먼저 초기화
  • 필드 변수 선언부 : 객체가 생성될 때 생성자 block 보다 앞서 초기화
  • 생성자 block : 객체가 생성될 때 JVM이 내부적으로 locking( thread-safe 영역 )

static이란?

  • static 키워드를 사용한 변수,메소드는 클래스가 메모리에 올라갈 때 자동으로 생성되며 클래스 로딩이 끝나면 바로 사용 가능
  • 즉 인스턴스 생성없이 사용 가능함
  • 모든 객체가 메모리를 공유한다는 특징이 있음
  • 가비지 컬렉터 관리 영역 밖에 있어 프로그램이 종료 될 때까지 메모리에 값이 유지

static을 사용하는 이유

  • 인스턴스 생성 없이 바로 사용이 가능하기 때문에 프로그램 내에서 공통으로 사용되는 데이터들을 관리할 때 사용

전역변수

  • class 안의 전체영역에서 사용하는 변수
  • 전역변수 값은 new 를 만나면 초기화
  • 초기화 없이 값을 유지하려면 static 사용

정적(static)변수

  • 여러 인스턴스가 공유해서 사용할 수 있는 변수

Inner class 장점

  • 내부 클래스에서 외부 클래스의 멤버에 손 쉽게 접근
  • 관련 있는 클래스를 묶어서 캡슐화를 증가
  • 외부에서는 내부클래스를 접근할 수 없어서 보안성 높임

에러와 예외의 차이

  • 에러는 실행 중 일어날 수 있는 치명적인 오류로 컴파일 시에 체크 안됨
  • 예외는 트라이 캐치 문으로 프로그램의 비정상 종료를 막을 수 있음

컬렉션 프레임 워크

  • 다수의 데이터를 쉽고 효과적으로 관리할 수 있는 클래스의 집합

LIST

  • 순서가 있는 데이터 집합
  • 중복 허용
  • Arraylist, Vector, LinkedList, Stack, Queue

SET

  • 순서가 없는 데이터 집합
  • 중복 허용 안 함
  • HashSet/ 순서 보장을 위해서는 LinkedHashSet

MAP

  • 키와 값이 쌍을 이루는 데이터 집합
  • 중복을 허용하지 않으며 순서가 없음
  • key의 순서를 보장하기 위해서는 LinkedHashMap을 이용

STACK

  • LIFO 구조

QUEUE

  • 큐인터페이스는 linkedList에 new 키워드를 적용해 사용
  • FIFO 구조

fianl

  • 클래스, 메소드, 변수, 인자를 선언할 때 사용할 수 있으며, 한 번만 할당하고 싶을 때 사용

출처 https://dev-coco.tistory.com/153

profile
주니어 개발자의 개발일지

0개의 댓글