객체 지향 언어

객체 지향 언어가 출현할 당시 가장 범용적으로 사용되는 언어는 절차 지향 언어였다. 객체 지향 언어는 절차 지향 언어의 단점을 보안고 다음 목적을 달성하기 위해 탄생했다.

- 소프트워어의 생산성 향상

 객체 지향 언어는 상속, 다형성, 객체, 캡슐화 등 소프트웨어의 재사용을 위한 여러장치를 내장하고 있다.

- 실세계에 대한 쉬운 모델링

 컴퓨터의 발전에 따라 실세계에서 발생하는 일을 프로그래밍해야 할 일이 더욱 많아지게 되었다. 객체의 속성과 행위를 묘사하고 객체 사이의 상호작용을 표현하는 방법으로 효과적인 프로그래밍을 할 수 있게 한다.

 C언어처럼 위에서부터 아래의 방향으로 절차대로 명령어를 실행하는 프로그램을 절차 지향 프로그램이라고 부르며 이런 언어를 절차 지향 언어라 한다. 이런 언어들은 흐름도를 설계하고 흐름도에 맞게 프로그래밍 함으로써 일련의 동작들이 순서에 맞게 실행되도록 작성한다.

 그러나 실제 세상은 각 물체 간의 관계, 상호 작용 등 훨씬 복잡하게 구성되어있다.이에 등장한 객체 지향 프로그램은 보다 실제 세상에 가깝게 모델링하여 물체를 객체로 표현한다.

객체지향 언어의 특성

-캡슐화

-상속

-다형성

-캡슐화(Encapsulation)

 캡슐화란 객체를 캡슐로 싸서 그 내부를 보호하고 볼 수 없게 하는것을 말한다. 자바에서 객체는 메소드(함수)와 필드 (데이터 변수)로 구성된다. 클래스라는 캡슐을 사용하여 객체를 표현하며 메소드(method)와 필드(field)를 클래스 내에 구현한다. 이렇게 함으로써 객체 외부에서는 객체 내의 숨겨놓은 메소드나 필드를 직접 접근할 수 없으며 메소드의 구현 내용도 알 수 없다. 몇몇 메소드와 필드는 객체 외부와의 인터페이스를 위해 노출된다.

 캡슐화의 목적은 객체 내 데이터에 대한 보안, 보호, 외부 접근 제한등을 위한것이다. 이때 외부에서 클래스 내부의 데이터 접근을 금지하는 것을 정보 은닉화라고 한다.

-상속(Inheritance)

 상속은 상위 개체의 속성이 하위 개체에 물려져서, 하위 개체가 상위 개체의 속성을 모두 가지고 있음을 의미한다. 예시로 동물은 생물의 속성을 갖고있고, 사람은 동물의 속성을 가지고 있다. 자바로 바꿔보면 동물은 생물의 부모 클래스이고 생물은 자식 클래스이다.

 자바에서 상속은 부모 클래스 즉 슈퍼 클래스(super class)를 자식 클래스 서브 클래스(sub class)가 상속받는것을 말한다. 상속은 이미 만들어진 클래스의 필드와 메소드를 물려받게 함으로써 자바 코드의 중복 작성을 방지하며, 코드의 재사용을 가능하게 한다.

-다형성(Polymorphism)

 다형성은 같은 이름의 메소드 호출에 대해 객체에 따라 다른 동작을 할 수 있도록 구현되는 것을 의미한다. 동물의 소리내기를 예로 든다면 개,고양이가 동물의 서브 클래스라 했을때 각각 개는 멍멍, 고양이는 야옹 하는 소리를 냈을 것이다. 이유는 개 고양이에 구현되어있는 소리내기는 각각 서로 다르기 때문이다. 이는 오버라이딩과 밀접한 관련이 있는데 오버라이딩은 다음에 오버로딩과 다시 다루겠다.

클래스와 객체 + 인스턴스

클래스는 객체들이 어떤 특성을 갖는다고 정의만 할 뿐 값을 가지지 않는다. 또한 객체의 행동에 대한 절차나 방법을 정의할 뿐 실제 행동을 하지않는다. 즉 클래스는 객체를 생성하기 위한 설계도 또는 틀이라 생각할 수 있다. 객체는 설계도 또는 틀로 찍어낸 실체라고 볼 수 있다. 이러한 이유로 객체를 클래스의 인스턴스 라고 부른다.

클래스 와 객체

클래스는 설계도 객체는 설계도로 구현한 모든 대상을 의미한다.

객체 와 인스턴스

클래스의 타입으로 선언되었을 때 객체라고 부르고, 그 객체가 메모리에 할당되어 실제 사용될 때 인스턴스라고 부른다.

객체는 현실 세계에 가깝고 인스턴스는 소프트웨어 세계에 가깝다.

엄격하게 객체와 인스턴스를 나누는것은 어렵다. 그래서 객체와 인스턴스 두 용어를 구별없이 사용한다.

클래스 구성

public class Person{ //클래스에 대한 접근 권한 - 키워드 - 클래스 이름
    public String name; //필드
    public int age;     //필드
    
    public Person(){ // 생성자(default)
    }
	public Person(String s){ // 생성자2
    	name = s
    }
    public String getName(){ //메소드
    	return name;
    }
}

위 코드가 기본적인 클래스의 구성이다. 이제 이 클래스로 객체를 생성해 보자.

객체 생성과 레퍼런스 변수

public static void main (String args[]){
   Person men;					// 객체에 대한 레퍼런스 변수 men선언
   men = new person("sejun");	// new 연산자 사용 person 객체 생성
   
   men.age=27;					//.을 이용해 객체 멤버 접근
   String s = men.getName();
}

위 코드는 객체를 생성하고 .을 이용해 객체 멤버에 접근하는 것을 보여준다.

Person men;  먼저 Person이라는 클래스의 레퍼런스 변수 men을 생성 했다. 객체를 생성할 때는 먼저 객체를 가르킬 레퍼런스 변수의 선언이 필요하다. men은 레퍼런스를 가지는 변수일 뿐 객체는 아니다.

자바에서는 반드시 new 연산자를 사용하여 객체를 생성해야 한다.

men = new person("sejun"); 이 문장의 실행 결과는

- Person 타입의 객체 메모리 공간 확보

- Person(String s){..} 생성자2가 실행되어 name 필드의 값을 "sejun"으로 설정

한것이다. 그럼 객체 men이 만들어진 것이다.

객체 멤버 접근

객체 멤버에 접근할 때는 점 . 연산자를 붙인다. men.age = 27; 은 men객체의 age필드에 27을 대입한 것이고, String s = men.getName(); 는 men객체의 getName() 메소드를 호출한 것이다.

+ Recent posts