자바 캡슐화

캡슐화는 관련이 있는 변수와 함수를 하나의 클래스로 묶고 외부에서 쉽게 접근하지 못하도록 은닉하는게 핵심입니다.
객체에 직접적인 접근을 막고 외부에서 내부의 정보에 직접접근하거나 변경할 수 없고, 객체가 제공하는 필드와 메소드를 통해서만 접근이 가능합니다.



캡슐화의 가장큰 장점은 정보은닉(Information Hiding)에 있습니다.
외부에서 객체접근하는데 있어서 정보를 숨기고 객체의 연산을 통해서만 접근이 가능하게 하는 것입니다.
정보은닉의 장점은 외부에서 특정 객체의 데이터 및 함수를 직접 접근을 막음으로써 변경을 못하게 하고 유지보수나 확장시 오류의 범위를 최소화 할 수 있고,
객체내 정보손상, 오용을 방지하고, 조작법이 바뀌어도 사용방법 자체는 바뀌지 않고, 데이터가 변경되어도 다른 객체에 영향을 주지 않기 때문에 독립성이 좋고,
처리된 결과사용으로 이식성이 좋고, 객체를 모듈화 할 수있어 새로운 시스템의 구성에 하나의 모듈처럼 사용이 가능하다.

 

 


★ 접근제어자

 

캡슐화를 하기 위해서는 접근제어자를 통해 설계가 잘 이루어져야 한다.
자신 내부의 모듈은 감추고, 다른 모듈의 내부 작업도 직접적으로 개입하지 못하도록 설계해야한다.

▷ 클래스 접근 제어자
default : 동일 패키지의 클래스(class)에만 인스턴스(객체)를 생성가능하다.
public : 다른 패키지에서 인스턴스(객체)를 생성가능하다.

▷ 메소드 접근 제어자
private : 동일한 클래스 안에서만 접근이 가능하고, this를 사용하는 것들은 외부에서 접근 불가능하고, 상속도 안된다.
default : 접근제어자가 없는 형태로 동일한 패키지 안에서만 접근이 가능하다.
protected : 동일한 패키지 안에서 사용가능하고, 다른 패키지라도 상속받은 클래스에는 접근이 가능하다.
public : 모든 객체에서 접근 가능하다.

 

 

 

★ setter와 getter


다음 예제를 통해서 캡슐화 과정을 살펴보자

public class member {

	private String id;
	private String pw;
	private int age;

	//getter
	public String getId() {
		return id;
	}
	public String getPw() {
		return pw;
	}
	public int getAge() {
		return age;
	}

	//setter
	public void setId(String id) {
		this.id = id;
	}
	public void setPw(String pw) {
		this.pw = pw;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

위의 예제는 일반적으로 회원관리시 회원정보를 캡슐화하여 회원정보를 은닉하여 보안을 높이는 효과가 있습니다.
member 클래스의 모든 변수는 private으로 접근제어자 선언을 해놓았기 때문에 member 클래스 내부에서만 접근이 가능합니다.
접근을 위해 setter와 getter 라는 장치를 만들어 내부에서 접근가능합니다.
입력할때는 set, 가져올때는 get을 사용하여 작동할 수 있음을 확인할 수 있습니다.

혹시 이해가 안되는 분을 위해서 쉽게 설명하겠습니다.

 

※ member 클래스 내부에 있는 변수들은 접근제어자가 private으로 선언이 되어있기 때문에 member 클래스 내부에서만 접금이 가능합니다.

 


☞ setter : member클래스내에 있는 변수(id)에 회원의 아이디값을 저장

public void setId(String id) {
	this.id = id;
}

public : 어디서든 접근이 가능
void : 리턴값이 없음
setId : 메소드이름
String id : 입력된 매개변수
this.id : member 클래스 내에 있는 private String id

 

 

☞ getter : member클래스내에 있는 변수(id)에 저장되어 있는 회원의 아이디값을 리턴

public String getId() {
	return id;
}

public : 어디서든 접근이 가능
String : 리턴값의 데이터타입
getId : 메소드이름
return : 리턴
id : member 클래스 내에 있는 private String id에 저장되어 있는 값


지금까지 캡슐화 및 정보은닉에 대해서 알아보았습니다.
이해가 안되시는 분들은 댓글 남겨주시면 아는 범위에서 최대한 알려드리도록 하겠습니다.

도움이 되셨다면 좋아요 부탁드립니다. 감사합니다.

★ 객체 지향 언어(客體指向言語 ) 사전적 의미

IT관련 객체 지향 프로그래밍에서 사용하는 언어로서, 객체를 만들고 조작하며 객체끼리 관계를 맺음으로써 다수의 객체가 함께 수행될 수 있게 한다.

 

 

※ 객체[Object]

시작하기에 앞서 객체의 의미를 먼저 알아야 합니다.
앞서 포스팅(하단에 링크제공)에서 말한바와 같이 자바의 절반은 객체라고 해도 과언이 아니기 때문에 객체지향언어나 자바를 공부하시는 분이라면 무조건 이해를 해야할 정도로 중요합니다.
객체(Object)란? 세상에 존재하는 모든것을 의미합니다. 즉, 주변에 있는 사물이나 생명체 같은 모든것들을 말합니다.
프로그래밍에서의 객체는 데이터의 분산을 막기 위해 데이터와 기능을 하나로 묶은 그룹이라고 볼 수있습니다.

이해를 돕기 위해 컴퓨터(PC)로 예를 들어보겠습니다.
컴퓨터(PC) = 데이터(본체, 모니터, 키보드, 마우스, 스피커.......등등) + 기능(화면제공, 소리, 입력, 출력.......등등)

위의 공식에 객체를 적용하면 이해하기가 쉬울거라 생각합니다.

객체[주변에 있는 모든 사물이나 생명체 등]

 

 

 

★ 객체지향언어(Object-oriented Language)

객체지향언어란?
컴퓨터 프로그래밍의 한가지 기법으로 객체를 만들고 객체를 사용하는 프로그래밍 방법을 말한다고 볼 수 있습니다.
다시 말해서 프로그램을 그저 데이터와 처리방법으로 나누는게 아니고, 프로그램을 다수의 "객체"를 만들고, 이들이 서로 상호작용을 통해 만들어지는 방식이다.

컴퓨터(PC)를 예로 들어 보겠습니다. 컴퓨터 한대를 완성하려면 CPU, RAM, BOARD, SSD, HDD, VGA, POWER, CASE 등 여러가지 부품이 있어야 합니다.
부품 하나하나가 연결이되고 조립이 되어야 여러분들이 사용하는 컴퓨터의 기능이 제대로 작동되고 사용 할 수있게 됩니다.
여기서 컴퓨터 부품(주변기기)들을 객체라고 생각하시면 됩니다.
각 부품들의 역할이 나뉘어져 있고 사용하고자 하는 부분에 대해서 각 부품들이 작동을 하게 됩니다.
고장이 나더라도 해당 부품만 수리 및 교체를 하면 간단하게 해결할 수 있습니다. 그렇기 때문에 유지보수도 쉽고 편해집니다.

즉, 명령어들로 이루어진 목록이 아닌 하나하나의 독립된 "객체"들의 그룹으로 생각하면 되고, 객체간의 메시지를 주고 받음으로서 쉽게 연결이 가능합니다.

객체지향언어

 

 

 

★ 객체지향언어의 특징

위에서 예를 들었듯 객체지향은 하나의 조립PC 같은 컴퓨터와 같다고 생각 할 수있습니다. 이를 기반으로한 객체지향의 특징에 대해서 알아 보겠습니다.

 

▷ 캡슐화(Encapsulation)
데이터와 코드의 형태를 외부로부터 알 수없게 하고, 데이터의 구조와 역할, 기능을 하나의 캡슐형태로 만드는 방법입니다.

객체지향언어 - 캡슐화

 

▷ 상속(Inheritance)
상위 클래스의 모든걸 하위 클래스가 모두 이어 받는것 입니다. 즉, 부모가 자식에게 유전자를 물려주듯이 부모의 특징을 자식에게 모두 물려줍니다.

객체지향언어 - 상속

 

▷ 다형성(Polymorphism)
상속과 연관이 있는 개념으로 한 객체가 다른 여러형태(객체)로 재구성 되는 것을 말합니다.
쉽게 말하면 한부모의 밑에서 태어난 자식(쌍둥이포함)이 똑같지는 않는것과 같은 것과 같다할 수 있습니다.
자바의 오버로드(Overload) 또는 오버라이드(Override)이 다형성의 대표적인 예라 할 수있고, 이 것을 구현하는걸 오버로딩(Overloading)과 오버라이딩(Overriding) 이라고 한다.

객체지향언어 - 다형성

 

▷ 추상화(abstraction)
추상화는 객체의 공통적인 속성과 기능을 추출하여 정의하는것을 말합니다.
다시 말하면 실제로 존재하는 객체들을 프로그램으로 만들기 위한 공통적인 특성을 파악해서 필요없는 특성을 제거하는 과정을 가르킵니다.

※ 캡슐화, 상속, 다형성, 추상화는 다음포스팅에서 자세히 알아보도록 하겠습니다.

객체지향언어 - 추상화

 

 

 

★ 객체지향언어의 장점

객체지향언어 - 장점


1. 재사용성
상속을 통해 프로그래밍시 코드의 재사용을 높일 수 있음.

 

2. 생산성 향상
잘 설계된 클래스를 만들어서 독립적인 객체를 사용함으로써 개발의 생산성을 향상시킬 수 있음.

 

3. 자연적인 모델링
우리 일상생활의 모습의 구조가 객체에 자연스럽게 녹아들어 있기 때문에 생각하고 있는 것을 그대로 자연스럽게 구현할 수 있다.

 

4. 유지보수의 우수성
프로그램 수정시 추가, 수정을 하더라도 캡슐화를 통해 주변 영향이 적기때문에 유지보수가 쉬워서 매우 경제적이라할

수 있다.

 

 

 

★ 객체지향언어의 단점

객체지향언어 - 단점

1. 개발속도가 느린점
객체가 처리하려는 것에 대한 정확한 이해가 필요하기에 설계단계부터 많은 시간이 소모 된다.

 

2. 실행속도가 느린점

객체지향언어는 대체적으로 실행속도가 느리다.

 

3. 코딩난이도 상승
다중 상속이 지원되는 C++ 같은 경우에 너무 복잡해져 코딩의 난이도가 상승할 수 있다.

 

 

 

 

★ 객체지향언어의 종류
- 자바[JAVA] : 객체지향언어의 대표적인 언어

자바

 

- 시뮬라67[Simula67] : 최초의 객체지향언어

시뮬라67


- 스몰토크[Smalltalk] : 최초로 GUI를 제공하는 언어

스몰토크


- 오브젝티브-C[Objective-C] : 애플의 운영체제인 iOS에서 사용되는 언어

오브젝트-C


- 비주얼 베이직 닷넷[Visual Basic .NET, VB.NET] : 비주얼 베이직(VB)의 발전된 객체지향언어

.NET


- C++ : 객체지향성이 더해진 C 언어의 확장형

C++


- C# : 닷넷 플랫폼에 의존도가 높은 프로그래밍 언어

C#


- 엠바카데로 델파이[Embarcadero Delphi] : 오브젝트 파스칼 프로그래밍 언어로부터 파생된 언어인 델파이를 이용

엠바카데로 델파이


- 파이썬[Python] : 플랫폼 독립적이며 인터프리터식, 객체지향적, 동적 타이핑(dynamically typed) 대화형 언어

파이썬


- 펄[Perl] : 인터프리터 방식의 프로그래밍 언어 혹은 그 인터프리터 소프트웨어


- 루비[Ruby] : 동적 객체 지향 스크립트 프로그래밍 언어이고, 순수 객체 지향 언어

루비


- 액션스크립트[ActionScript] : 2000년 7월 액션스크립트 1.0이 플래시 5에서 처음 소개

액션스크립트


- 액티브 서버 페이지(Active Server Page, 줄여서 ASP) : 마이크로소프트사에서 동적으로 웹페이지들을 생성하기 위해 개발한 서버 측 스크립트 엔진

ASP


- 스위프트[SWIFT] : 애플이 iOS8 과 OS X 프로그래밍을 위해 개발한 언어

스위프트

 

 

※ 객체지향언어가 인기를 얻은 이후에 기존의 프로그래밍 언어들이 객체지향의 요소를 추가하거나 확장하는 형태가 만들어지게 된다.

 

 

 

2019/05/16 - [Language/Java] - 프로그래밍언어 자바[Java]란 무엇인가?

 

프로그래밍언어 자바[JAVA]

자바는 프로그래밍언어의 하나로 대표적인 객체지향 프로그래밍 언어입니다.
1991년 제임스 고슬링이 썬 마이크로시스템즈에서 연구원들과 함께 C언어 기반으로 연구를 시작하였다.
가전제품들의 자동화 구현을 위하여 어떤종류의 CPU칩에서도 동작하고, 네트워크 연결로 통제가능한 프로그램 언어를 개발한다는 취지였다.
제임스 고슬링은 연구실 밖에 있는 참나무를 보고 언어명을 오크(Oak)라 지었으나, 다른 업체에서 이미 상표등록을 하여서 선점을 하였기에 다른 이름으로 변경해야만 했었다.
여러이름의 후보가 논의 되었으나 커피를 좋아하는 연구원들에 의해서 지금의 이름인 자바(Java)가 탄생하게 되었다.
자바는 1993년 인터렉티브TV(Interactive TV)에 적용되기도 하였고, 기존의 월드 와이드 웹서비스(www)가 가지고 있었던 한계와 높은 호환성과 간단하고 정제된 언어이다.
최초 공개버전 자바 1.0은 1995년에 출시 되었고, C언어보다 네트워크 환경에 대한 지원이 간편했기 때문에 자바 애플릿 형태로 웹에서 많이 사용되었다.
1998년 12월 ~ 1999년에 걸쳐 출시된 자바2는 여러가지 플랫폼에 사용할 수 있는 설정을 지원하였다.

1995년 자바1.0(JDK 1.0)이 출시된 이후에 썬 마이크로시스템즈는 2006년 대부분의 자바코드를 GPL 라이선스로 공개하였다.

 

 

2010년 오라클에 인수된 이후 현재는 자바에 대한 유지보수나 관리는 오라클에서 책임지고 있다.
자바는 Java SE와 JDK/JRE 버전으로 관리되고 있다.

 


자바는 크게 4가지로 분류할 수있다.

 

* Java SE(Java Standard Edition / J2SE)
자바의 표준으로서 자바의 핵심 API, 기능등을 제공하고 JDK 항목도 참고한다.

 

*Jakarta EE, 구 Java EE(Java Enterprise Edition / J2EE)
기업에서 관리하는 서버의 페이지에 유리하고, JSP와 서블릿(Servlet), 웹어플리케이션에 관한 여러가지 기술들이 내장되어 있다.

 

* Java ME(Java Micro Edition / J2ME)
센서, 셋톱박스, PDA와 같은 임베디드 환경에 최적화된 시스템이다.

 

* JavaFX
데스크탑 어플리케이션의 개발과 배포 그리고 크로스플랫폼과 GUI 라이브러리를 갖추고 있다.

 

 


여기까지는 자바의 역사와 구성을 알아봤습니다. 다음으로는 저의 생각과 장단점에 대해서 이야기 하도록 하겠습니다.

제가 생각하는 자바는 한마디로 말하면 객체다 라고 할 수있습니다. 객체를 이해하면 자바의 반절은 이미 깨우쳤다해도 과언이 아닙니다. (객체지향에 대해서는 다음에 포스팅 하겠습니다.)
이미 다른 몇몇 언어들도 객체지향을 표현 할 수있게 업데이트가 되어있으며, 절차지향형 언어에 비해서 크고 복잡한 프로그래밍에 유리합니다.

 

 

 

★ 자바의 장점

 

1. 자바는 간단하면서 가독성이 좋다. 일반적으로 소프트웨어를 개발하면 비용도 많이 들고, 유지보수 비용또한 엄청나다. C언어 기반으로 만들어지기는 했지만 C언어에서 문제가 되는 부분을 오버로딩이나 상속등을 통해서 제거했다. 또한 메모리 할당문제도 자동으로 회수와 할당(auto garbage collection)을통해서 극복했다. 자바는 같은 시기에 만들어진 언어에 비해서 명확하고 가족성이 뛰어났다고 볼 수 있다.

 

2. 자바는 객체지향언어다. 자바에는 상속이라는것이 있다. 상속을 통해 부모의 객체는 자식 객체에서 모두 사용 할 수있기 때문에 개발시 재활용의 의미가 크다고 볼 수있다.

 

3. 안정성과 보안에 강하다. 다른언어보다 높은 안정성을 꼽고 있다. 특히 다중상속을 제거함으로서 안정성을 높였으며, 네트워크 분산처리 환경에서 사용하기 위해서 디자인된 언어인 만큼 보안에 중점을 두고 있다. 자바는 바이러스가 침투하지 못하는 구조를 가지고 메모리에서 데이터접근을 제한 할 수 있기 때문에 데이터접근을 쉽게 차단 가능하다.

 

4. 호환성이 매우 좋다. 운영체제에 JVM(Java Virtual Machine)을 설치하게 되면 자바로 만든 프로그램은 어떤 컴퓨터에서도 똑같이 작동한다. JVM에서 구동 가능한 자바이외의 언어가 존재하는데, 이를 사용하면 자바와 동일한 수준의 호환성을 볼 수있다.

 

 


★ 자바의 단점

 

1. 속도가 느리다. 느리긴 하지만 C/C++과 같은 네이티브 바이너리 코드로 만드는 언어보다 늦는다는 이야기다. 다른 언어들과 비교했을때 오히려 빠르다. 자바스크립트나 파이썬보다도 빠르다고 볼 수있다.


2. JVM의 로딩속도가 느리다. 자바는 JVM이 반드시 로딩되어야 하기 때문에 느릴 수밖에 없다.


3. 가비지 컬렉션에 의한 지연문제. 메모리 프리징 현상이 초기부터 자바를 괴롭혔다고 볼 수있다. 지금은 많이 개선되었지만 그래도 단점중의 하나이다.


4. 불편한 예외 처리. 다른 언어에서도 사용하고 있는 좋은 기능이지만 자바에서는 개발자의 검사가 필요한 예외라면 무조건 선언을 해줘야한다.


5. 소스 코드의 길이가 길다. 다른 언어에 비해서 길이가 긴편이다. 같은 기능을 프로그래밍 한다고 하더라도 코드자체가 길다. 기본적인 구조 코드 자체가 많기 때문에 길수밖에 없다.

 

 


자바에 대해서 이야기 해봤는데 무척 길어진거 같습니다.
저도 포스팅을 하면서 다시한번 공부하는 시간을 가진거 같습니다.
앞으로는 객체지향, 자바개발환경, 자바의 기초 등을 순서대로 포스팅하도록 하겠습니다.

2019년 1월부터 오라클에서 자바를 유료화 했습니다.
물론 개인사용자는 2020년까지 사용가능한데, 자바를 공부한 사람으로써 앞으로 어떻게 해야할지 고민이 되는 부분이네요.
어쨋든 그건 나중에 생각하기로 하고 계속 포스팅 하도록 하겠습니다.

 

 

2019/05/20 - [Language/Java] - 객체지향언어란? [특징, 장점, 단점, 종류]

+ Recent posts