[JAVA] JAVA, 객체지향 프로그래밍
최근에 본 면접에서 JAVA+SpringBoot로 진행한 프로젝트에 대해 언급했더니 JAVA에 대해 얼마나 아는지, 객체지향에 대해서는 얼마나 알고있는지에 대한 질문이 들어왔었는데,
배운지 오래되기도 했고, 일단 개발부터 하느라 바빠서 제대로 된 답변을 하지 못했던 것 같다.
그래서 다시 한 번 복기해볼 필요가 있겠다는 생각에 이번 글을 작성하게 되었다.
JAVA란?
자바(Java)는 C언어에 객체 지향적 기능을 추가하여 만든 C++과는 달리, 처음부터 객체 지향 언어로 개발된 프로그래밍 언어이다.
자바는 자바 가상 머신(JVM, Java Virtual Machine)을 사용하여, 운영체제와는 독립적으로 동작할 수 있다.
-> 따라서 자바는 어느 운영체제에서나 같은 형태로 실행될 수 있다!
JAVA 구성요소
JDK(Java Development Kit, 자바개발키트)
- JDK란 자바 프로그램을 개발하기 위해 필요한 툴들을 모아 놓은 소프트웨어 패키지이다.
- JRE + 개발도구(컴파일러, 디버거 등)
JRE(Java Runtime Environment, 자바실행환경)
- JRE란 자바 프로그램을 실행하기 위해 필요한 환경이다.
- JVM + 클래스 라이브러리
- 개발자뿐만 아니라 자바 프로그램을 실행하려는 사용자라면 JRE가 필요하다.
JVM(Java Virtual Machine, 자바가상머신)
- JVM이란 자바 바이트코드(.class)를 이용하여 자바 프로그램을 실행시켜주는 프로그램이다.
- 개발자가 작성한 자바 소스파일(.java)를 컴파일러(javac)가 컴파일하면 바이트코드가 되고, JVM이 이 바이트코드를 실행하여 프로그램을 실행한다.
- JVM이 있어서 자바 프로그램은 OS에 독립적이다
- 반면에 JVM은 OS에 종속적이다
JAVA의 특징
1. 운영체제에 독립적으로 동작
JVM이 설치되어 있는 OS에서는 모두 자바로 작성된 프로그램이 실행 가능하다.
그래서 자바 언어를 Write once, run anywhere (한 번 작성하면, 어디서나 실행된다.)로 표현하기도 한다.
JVM의 경우는 기존의 하드웨어로 구성된 컴퓨터를 소프트웨어적으로 구현한 것으로, 자바로 작성된 프로그램은 모두 이 JVM을 통해 실행되므로 자바 프로그램을 실행하기 위해서는 JVM이 설치되어 있어야 한다.
2. 객체지향언어 (OOP, Object - Oriented Programming language)
자바는 객체지향개념의 특징인 상속, 캡슐화, 다형성이 잘 적용된 순수한 객체지향언어이다.
3. 가비지컬렉터 (GC, Garbage Collector)를 통한 자동 메모리 관리
자바는 개발자가 직접 메모리에 접근할 수 없으며 자바가 직접 관리한다.
다른 프로그래밍 언어와는 달리, 자바는 가비지 컬렉터(GC)가 자동으로 메모리를 관리하여 참조되고 있지 않은 메모리를 해제해준다.
이러한 특징으로 인해 프로그래머는 메모리 관리에 신경 쓸 필요 없이 오직 프로그래밍에만 집중 할 수 있다.
4. 네트워크, 분산처리의 지원
다양한 Java API 라이브러리들은 네트워크 및 분산처리와 관련된 기능을 쉽게 개발할 수 있도록 지원한다.
이러한 특징으로 인해 자바 언어는 대규모 분산처리 환경 등의 프로그래밍에 적합하다.
5. 멀티쓰레드의 지원
하나의 프로그램 단위가 동일한 쓰레드를 동시에 수행할 수 있다.
운영체제마다 멀티쓰레드를 이용하는 API가 다르지만, 자바의 경우 Java API를 통해 쉽게 구현할 수 있다.
6. 동적 로딩(Dynamic Loading)의 지원
자바는 동적 로딩을 지원함으로써 프로그램 실행 시 모든 클래스가 로딩되지 않고 필요한 시점에 필요한 클래스만을 로딩하여 사용할 수 있다.
객체지향 프로그래밍(Object Oriented Programming, OOP)
객체지향 프로그래밍(Object Oriented Programming, OOP) 이란,
프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체로 만들고,
객체들 간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.
객체지향 프로그래밍은 유연하고, 코드의 재사용을 줄이고, 코드의 가독성을 높이며, 유지보수를 용이하게 만드는 것이 목적이다.
객체지향 프로그래밍의 4가지 특징
캡슐화 / 상속 / 추상화 / 다형성
1. 캡슐화 (Encapsulation)
- 데이터와 메서드를 하나의 단위로 묶어 관리하고, 외부에서 접근하지 못하도록 보호한다.
- 데이터 보호
- 외부로부터 클래스에 정의된 속성과 기능들을 보호
- 데이터 은닉
- 내부의 동작을 감추고 외부에는 필요한 부분만 노출
- 접근 제어자
- public : 클래스 내부/외부에서 접근이 가능하다
- protected : 해당 객체를 상속받은 객체 내부에서 접근할 수 있다. 단순 인스턴스에선 접근할 수 없다.
- default : 동일한 패키지 내의 객체에서 인스턴스를 생성하여 접근할 수 있다.
- private : 클래스 내부에서는 접근이 가능하나 외부에서는 접근할 수 없다.
2. 상속 (Inheritance)
- 부모 클래스에 정의된 변수 및 메서드를 자식 클래스에서 상속받아 사용한다. (extends 키워드 사용)
- ✅ 중복된 속성들을 class마다 만들어주기보다는 공통된 속성들을 하나로 모아놓은 클래스를 만들어서, 그 클래스를 상속하도록 하면 효율적인 프로그래밍이 가능하다. (중복 코드 제거 & 재사용가능)
- 추가 정보
- 자바의 모든 class는 Object 클래스의 후손이다.
- 부모클래스의 생성자, 초기화 블록은 상속이 되지 않는다.
- 부모의 private 멤버는 상속은 되지만 직접 접근 불가하다.
- 자바는 단일 상속만 지원한다.
3. 추상화 (Abstraction)
- 클래스들의 공통적인 특성(변수, 메소드)들을 묶어 표현하는 것
- 위의 사진을 예로 들어 설명하자면,
- 데스크탑과 노트북이라는 객체가 있을때, 이 객체들을 하나로 묶을 때 공통적인 특징들을 컴퓨터로 묶어서 이름 붙이는 것을 추상화라고 할 수 있다.
- 이처럼 공통된 기능을 '컴퓨터'에서 미리 구현을 하고, 상속을 통해 공통된 기능을 데스크탑과 노트북에 이어주면, 데스크탑과 노트북은 각자의 고유기능을 집중적으로 개발할 수 있다.
- 이렇게 되면 공통된 기능을 다시 정의할 필요가 없기에, 코드의 중복이 줄어들고, 코드의 재사용이 용이해지는 장점이 있다.
즉, 추상화로 구현해두면, 새로운 객체를 만들 때, 클래스의 고유기능만 새로 만들어주고, 공통된 기능은 상속을 통해서 이용가능하다.
4. 다형성 (Polymorphism)
- 다양한 형태로 표현이 가능한 구조를 말한다. 객체도 상황에 따라 여러가지 형태를 가질 수 있다.
- 오버라이딩 (Overriding)
- 부모 클래스로부터 상속받은 메서드 내용을 변경하여 사용하는 것
- 부모 클래스와 자식 클래스의 메서드를 비교하여 메서드 이름, 매개변수 개수, 리턴 타입, 순서가 동일하다면 메서드를 재정의 가능하다.
- 즉, 부모 클래스의 메서드를 자식 클래스에서 재정의해서 사용하는 것을 말하며, 자식 클래스는 부모 클래스의 메서드를 재활용하면서, 독자적인 기능을 추가할 수 있다.
- 오버로딩 (Overloading)
- 하나의 클래스 안에서 같은 이름의 메서드를 여러 개 정의하는 것
- 같은 이름의 메서드를 다양한 매개변수 타입과 개수로 오버로딩하여 사용하는 것을 말한다.
적절한 다형성 사용은 코드의 재사용성과 유연성을 높이고, 불필요한 코드 중복과 결합도를 낮춰서 유지보수성을 높일 수 있다.