본문 바로가기

JAVA

[JAVA] 자바란 무엇인가?

1. 자바의 탄생과 역사

2. 자바의 특징

    2.1. 캡슐화

        2.1.1. 접근 제한자

    2.2. 상속

    2.3. 다형성

    2.4. 인터프리터

3. 자바의 단점

4. 절차 지향형 VS 객체 지향형

 

1. 자바의 탄생과 역사

● 1991년 썬 마이크로시스템즈사에서 제임스 고슬링이 고안하였고 오크, 혹은 그린이라고 불림

● 오크는 최초 가전제품에서 쓰일 프로그램의 개발이 목적이었지만 인터넷과 웹의 출현으로 자바의 초점은 가전제품에서 인터넷으로 옮겨지게 되었고, 이후 1995년 이름을 자바로 변경

● 2009년 썬 마이크로시스템즈는 오라클과 인수 합병되었고, 자바에 대한 권리 및 유지보수 또한 오라클로 넘어가게 됨

 

2. 자바의 특징

● 객체 지향 언어이다

객체지향 프로그래밍이란 프로그램을 개발하는 기법으로 부품에 해당하는 객체들을 먼저 만들고, 이것들을 하나씩 조립 및 연결하여 전체 프로그램을 완성하는 것
객체를 만들기 위해서는 설계도인 클래스를 작성하고, 객체와 객체를 연결하여 목적에 맞는 프로그램을 만들어 냄
객체지향 언어의 특징인 캡슐화, 상속성, 다형성을 완벽하게 지원함

 

● 이식성이 높다

서로 다른 실행 환경을 가진 시스템 간에 프로그램을 옮겨 실행할 수 있는 것
자바 실행환경이 설치되어 있는 모든 운영체제에서 실행이 가능

 

● 인터프리터 언어이다

컴파일 언어인 동시에 인터프리터 언어
텍스트 소스를 컴파일하여 2진 파일(클래스 파일)로 만든 다음 자바 런타임이 클래스 파일을 하면서 실행

 

● 메모리를 자동으로 관리

C++은 메모리에 생성된 객체를 제거하기 위해 개발자가 직접 코드를 작성해야 한다. 만약 이 작업을 성실하게 해주지 않는다면 프로그램은 불완전해지고 갑자기 다운되는 현상을 겪을 수도 있음
개발자가 직접 메모리에 접근할 수 없으며 메모리는 자바가 직접 관리
객체 생성 시 자동으로 메모리 영역을 찾아서 할당하고 사용이 만료되면 쓰레기 수집기를 실행시켜 자동으로 사용하지 않는 객체

 

● 멀티 스레드 구현이 쉬움

운영체제에 따라 멀티 스레드를 구현하는 방법이 다르지만, 자바는 스레드 생성 및 제어와 관련된 라이브러리 API를 제공하므로 운영체제에 상관없이 멀티 스레드를 쉽게 구현할 수 있음

 

● 동적 로딩을 지원

실행 시에 모든 클래스가 로딩되는 것이 아니라 필요한 시점에 클래스를 로딩하여 사용
앱의 변경사항이 발생해도 비교적 적은 작업만으로도 처리할 수 있는 유연한 앱을 장성할 수 있음

 

● 분산 환경을 지원

TCP/IP 라이브러리가 기본적으로 포함
http와 htp프로토콜을 기본적으로 지원

 

● 오픈소스 라이브러리가 풍부

자바는 오픈소스 언어이고 자바 프로그램에서 사용하는 라이브러리 또한 오픈소스의 양이 방대함
고급 기능을 구현하는 코드를 작성하는 대신 검증된 오픈소스 라이브러리를 사용하면 앱을 다시 컴파일할 필요가 없음

 

2.1. 캡슐화

객체의 속성(Attribute)과 행위(method)를 하나로 묶고 실체 구현 내용 일부를 외부에 감추는 것

 

● 캡슐화의 효과

외부 객체는 내부의 구조를 얻지 못하며 객체가 노출해서 제공하는 필드와 메서드만 이용 가능
필드와 메소드를 캡슐화하여 보호하는 이유는 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 하는 데 있음 자바 언어는 캡슐화된 멤버에 대한 노출 여부를 결정하기 위해 접근 제한자(Access Modifier)를 사용

 

2.1.2. 접근 제한자

접근 제한자는 3개로 구성되어 있다.

 

● private

1) 외부 접근 불가능 : 같은 클래스 안에서만 접근 가능
2) 오로지 해당 클래스 내부의 메소드만으로 접근이 가능
3) 상속된 하위클래스도 접근 불가능, 제일 강력한 접근제어로 '정보 은닉'을 위한 장치

 

● public 

1)외부 접근 가능 : 모든 클래스에서 사용 가능
2) 클래스 앞부분에 public을 붙이는 경우는 다른 패키지에서 사용할 수 있는 클래스를 만듦
(단, 클래스가 public이 아닌 경우는 같은 패키지에서만 접근 가능)

 

● protected

1) 상속관계에 있는 자식 클래스만 쓸 수 있게 만든 것
2) 같은 패키지의 클래스와 다른 패키지의 서브클래스에서도 접근 가능

 

● default

1) 접근제어자가 지정되어 있지 않은 경우 default가 적용
2) 동일한 패키지에 있는 클래스의 모든 메소드가 접근 가능

 

 

2.2. 상속

현실세계와 반대로 자식이 부모를 선택해서 물려받는 것

 

● 상속의 효과

부모 클래스를 재사용해서 자식 클리스를 빨리 개발할 수 있음
반복된 코드의 중복을 줄여줌
유지 보수의 편리성 제공(부모 클래스를 한 번만 수정함으로써 자식 클래스를 수정할 필요가 없음)
객체의 다형성을 구현할 수 있음

 

2.3. 다형성

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

부모 타입에는 모든 자식 객체가 대입될 수 있으며 자식 타입은 부모 타입으로 자동 타입 변환됨

 

2.4. 인터프리터

프로그래밍 언어의 소스 코드를 바로 실행하는 컴퓨터 프로그램 또는 환경

인터프리터는 다음의 과정 가운데 적어도 한 가지 기능을 가진 프로그램이다.

 

소스코드를 직업 실행
소스 코드를 효율적인 다른 중간 코드로 변환하고, 변환한 것을 바로 실행
인터프리터 시스템의 일부인 컴파일러가 만든, 미리 컴파일된 저장 코드의 실행을 호출

 

3. 자바의 단점

● 실행을 위해 자바 가상 머신을 거쳐야 하므로, 다른 언어에 비해 실행 속도가 느림

● 예외 처리가 잘 되어 있지만, 개발자가 일일이 처리를 지정해 줘야 한다는 불편함이 있음

● 다른 언어에 비해 작성해야 하는 코드의 길이가 긴 편

 

4. 절차 지향적 VS 객체 지향형

● 절차 지향형 : 시간의 순으로 프로그래밍을 하는 것

ex) 아침에 일어난다 -> 씻는다 -> 밥을 먹는다 -> 버스에 탄다 -> 버스 요금을 낸다 -> 학교에 도착한다.

 

● 객체 지향형 : 객체를 정의하고 객체 간 협력을 프로그램으로 구현하는 것

ex) 학생 <-> 밥 : 먹는 관계
학생 <-> 버스 : 타는 관계
학생 <-> 학교 : 가는 관계