Java: High level, Object-Oriented Language
자바는 Sun Microsystem의 제임스 고슬링에 의해 1995 처음 개발한 언어로, 어떤 환경이든 JVM만 있으면 구동할 수 있게 만들어진 언어이다. 주로 큰 스케일의 엔터프라이즈 애플리케이션 개발에 사용된다. 자바는 (1) 스스로 메모리 관리를 해주고, (2) 다양한 기본 라이브러리들을 제공해주고, (3) 강력한 보안 정책을 제공해준다는 특징이 있다.
1. OOP
Object-Oriented Programming의 약자인 OOP는 Object라는 개념에 기반한 프로그래밍 패러다임을 의미한다. Object는 데이터(ex. 변수)와 코드(ex. 메서드)를 포함한다. OOP에서 컴퓨터 프로그램은 서로 상호작용할 수 있게 만들어져 있다.
Object 란 state와 behavior, Identity를 가진 실제 세상의 객체를 의미한다.
- State: Object의 가치
- Behavior: 출금, 예금과 같은 행동
- Identity: 다른 Object와 구분할 수 있는 id와 같 특별한 값
이런 Object를 논리적 개체로 만든 것이 Class!
다시 OOP로 돌아와서, OOP의 기본 원칙은 (1)추상화 Abstraction (2) 캡슐화 Encapsulation (3) 다형성 Polymorphism (4) 상속Inheritance으로 구성되어 있으며 Java는 이에 더해 (5)Association (6)Aggregation (7)Composition 의 원칙을 더 가지고 있다.
(1) Abstraction
간단하게 추상화란 Object와 관련있는 특성들만 보여주고, 필요없는 디테일들을 숨기는 것을 말한다. 불필요한 부분을 생략하고, 객체 속성 중 중요한 것에 중점을 두어 모델화를 함으로써 데이터의 공통된 성질을 추출할 수 있다. 예를 들어, 우리가 자동차를 운전할 때 차에 시동을 거는 것, 엑셀을 밟는 것은 신경쓰지만 어떤 원리로 차가 앞으로 가고 멈추는 지에 대해서는 궁금해하지 않는다. 추상이라는 개념은 이처럼 end-user가 애플리케이션을 사용할 때, 그 구체적인 특징에 대해 신경쓰지 않을 수 있도록 하는 것이다. Thereby the user will only know "what is does" rather than "how it does".
OOP에서 추상화는 크게 두가지 유형으로 분류된다. 1) Data Abstraction, 2) Control Abstraction.
1) Data Abstraction을 통해 우리는 객체가 내부적으로 데이터를 어떻게 저장하고 처리하는지를 감추고 외부에 필요한 기능만 제공하게 된다. 자동차를 예로 들었을 때, GV80-> SUV-> 현대차 -> 자동차로 데이터의 공통적인 특성을 묶어 이름붙이는 것을 말한다.
2)Control Abstraction은 프로그램의 흐름이나 제어 구조를 추상화하는 것을 의미한다. 복잡한흐름을 단순화하고, 반복적이거나 복잡한 로직을 한번에 처리할 수 있도록 직관적으로 코드를 작성하는 것을 말한다. 메서드, 반복문, 조건문이 대표적인 제어 추상화이다.
그렇다면 우리는 자바에 어떻게 추상화를 적용할 수 있을까? 자바는 non-access modifier "abstract"를 제공한다. abstract modifier는 class나 method에서는 사용되나 변수에서는 사용할 수 없다. Interface는 구현없이 프로토타입의 메서드만 제공한다. Abstract class는 최소 1개의 구현되지 않은 메서드를 포함하고 있는 클래스를 의미한다. 추상 클래스와 관련된 내용은 다음에 더 자세히 알아보는 것으로 하자.
(2) Encapsulation
캡슐화는 한 클래스 안에 관련이 있는 변수와 메서드를 만들고, 외부에서 접근하거나 수정하는 것을 막는 것을 의미한다. 캡슐화를 하는 이유 중 하나는 관련 필드와 메서드를 함께 둠으로써 코드를 더 깔끔하고 읽기 쉽게 만들 수 있다는 것이다. 변경 가능성이 높은 부분은 내부에 숨기고, 외부에는 안정적인 부분만 공개함으로써 외부에 영향을 주지 않고 객체 내부의 구현을 변경할 수 있다. getter나 setter를 이용해서 read-only, write-only 접근을 제공한다.
Data hiding은 데이터의 디테일한 구현을 숨김으로써 데이터에 대한 접근을 제한하는 방법이다. 외부에서의 접근을 제어하여 변수 값을 변경하지 못하게 하여 객체 내 정보 손상, 오용을 방지할 수 있다. 또한 데이터가 변경되었을 때에도 다른 객체에 영향을 주지 않아 독립성이 좋다는 장점이 있다. 접근제어자를 통해 data hiding을 하는 경우도 있다.
자바의 접근제어자는 크게 private, package(default), protected ,public로 나누어진다. private은 해당 클래스에서만 접근이 가능하고, 외부에서는 불가능하며 상속도 할 수 없다. package는 같은 패키지에서 접근이 가능한 경우를 말한다. protected는 같은 패키지에서 뿐 아니라, 상속받은 클래스에서도 접근 가능한 경우이다. 마지막으로 public은 모든 객체에서 접근 가능한 경우를 말한다.
다시 캡슐화로 돌아와서, 변수나 메서드가 private 접근제어자로 작성되었을 경우, getter와 setter 메서드를 통해 해당 변수에 접근할 수 있어서 정보를 은닉하고 보안을 높일 수 있다는 장점이 있다. setter에서는 주로 변수에 대한 제약 조건을 걸어주어 사용할 수 있다.
* Abastraction과 Encapsulation의 차이
- Abstraction is a design-level process, but encapsulation is an implementation process.
앞서 설명했듯 추상화는 데이터의 기능적 요소를 취하여 일반화를 하는 것이고, 캡슐화는 데이터를 패키지화하여 외부로부터 보호하는 역할을 한다고 이해할 수 있다.
참고자료
'CS > Java' 카테고리의 다른 글
[BackEnd]Java란 무엇인가: OOP(3) SOLID (0) | 2024.10.20 |
---|---|
[BackEnd]Java란 무엇인가: OOP(2) Inheritance&Polymorphism (0) | 2024.10.20 |