(신) Java

4. 객체지향 프로그래밍

WolMido 2021. 7. 27. 16:04

객체지향 프로그래밍(OOP)

객체지향에는 여러 개념이 있는데 클래스, 객체, 인스턴스, 상속, 인터페이스, 다형성, 추상화가 있습니다. 

 

클래스

클래스는 객체를 만들어내는 틀입니다. Animal cat = new Animal();을 사용하여 클래스에 해당하는 멤버변수, 메서드가 포함된 객체를 생성할 수 있습니다. cat은 객체이고 Animal의 인스턴스입니다. 인스턴스라는 말은 어떤 클래스의 객체인지를 관계위주로 설명할 때 사용합니다.

 

멤버 변수(Instance Variable)

클래스에 선언된 변수를 멤버 변수라고 부릅니다. 다른 말로는 인스턴스 변수, 객체 변수, 속성이라고도 말합니다. 클래스에 의해 생성되는 것을 객체, 그리고 클래스에 선언된 변수를 객체 변수라고 생각하면 쉽습니다.

 

cat.name

(객체.멤버변수 이러한 방법으로 살 수 있습니다.)

 

메서드

클래스에는 멤버 변수와 더불어 메서드라는 것이 있습니다. 메서드는 클래스 내에 구현된 함수를 의미하는데 자바에서는 함수라고 말하지 않고 메소드라고 부릅니다. 

 클래스에는 보통 메서드로 Getter, Setter를 선언하는 경우가 있습니다. 게터와 세터는 private 되어있는 멤버 변수의 값을 바꾸기 위해서 메서드로 정의해 놓은 것을 의미하는데 위의 사진이 Setter입니다. 위의 this는 지금의 객체를 의미합니다. 즉 cat.setName()을 사용하면 cat이라는 객체에 대한 멤버변수의 값이 변경되게 됩니다.

 

다른 언어에서는 함수라는 것이 별도로 존재합니다. 하지만 자바는 클래스를 떠나 존재하는 것은 있을 수 없기 때문에 자바는 함수는 존재하지 않고 클래스 내에 존재합니다. 자바는 클래스 내의 함수를 메소드라고 부릅니다.

 

메서드를 사용하는 이유는 우리가 같은 내용의 코드를 반복해서 작성하는 경우가 있는데 반복되는 코드를 메서드로 정의해서 이를 가져다 사용하면서 반복되는 코드 내용을 줄일 수 있습니다.

* 반환값이 없는 메서드 같은 경우에 특정 조건에 return문을 사용하면 메서드의 종료를 의미한다.

 

객체 변수는 공유되지 않는다.

Animal cat = new Animal();

Animal dog = new Animal();

 

cat.setName("boby");

dog.setName("happy");

 

각각의 cat과 dog는 각각의 메모리 주소가 다르기 때문에 멤버변수의 값도 공유되지 않는다는 것을 알 수 있습니다. 

 

Call by value

메소드로 객체를 전달할 경우 메서드에서 객체의 멤버변수를 변경할 수 있습니다. Call by value라고 부릅니다. 메소드의 의 파라미터로 객체를 전달받는 경우에는 객체를 그대로 사용하기 때문에 메소드가 객체의 속성 값을 변경하면 메소드 수행 후 객체의 변경된 속성값이 유지되게 됩니다.

 

상속

상속은 말 그대로 자식이 부모로부터 무언가를 물려 받는 것을 말합니다. 상속을 받은 자식 클래스는 부모 클래스의 기능도 사용할 수 있습니다.

 

IS-A 관계

 

자식 클래스와 상위 클래스의 관계가 IS-A 관계라는 것은 자식 클래스가 상위 클래스의 하위 개념인 관계입니다. 예시를 들면 Dog 클래스는 Animal 클래스의 관계라고 할 수 있습니다.

 

 

오버리이딩

오버라이딩은 재정의라고 있습니다. 좀 더 구체적으로 말하면 부모 클래스에 있는 메서드를 자식 클래스가 동일한 형태로 또다시 구현하는 행위를 메서드 오버라이딩이라고 합니다.

 

오버로딩

파라미터의 종류, 개수가 다르면 동일한 이름의 메소드를 만들 수 있습니다. 이러한 것을 오버로딩이라고 합니다. 

 

다중 상속

C++, 파이썬 등 많은 언어들이 다중 상속을 지원하지만 자바는 다중 상속을 지원하지 않는다. 

 

생성자

생정자를 사용하면 멤버 변수의 값을 무조건 설정할 수 있도록 강제할 수 있습니다.

 

생성자의 규칙

1. 클래스명과 메소드명이 동일하다

2. 리턴타입을 정의하지 않는다.

 

클래스에 생성자가 하나도 정의되어 있지 않으면 자바는 컴파일러가 실행될 때 자동으로 디폴트 생성자를 추가해줍니다. 그렇기 때문에 우리가 new 클래스()를 사용하여 객체를 생성할 수 있는 것입니다.

 

하나의 클래스에 여러 개의 파라미터를 가진 생성자를 가질 수 있습니다. 즉 멤버변수의 개수에 따른 오버로딩이 가능합니다.

 

 

인터페이스

인터페이스는 메소드는 메소드의 이름과 입출력에 대한 정의만 있고, 그 내용은 없다. 우리는 이런 메소드를 추상메서드라고 합니다. 인터페이스는 메서드의 선언부만이 있기 때문에 이를 구현하는 클래스드들은 인터페이스에 정의된 추상 메서드를 구현해야할 의무가 있습니다. 인터페이스는 작업명세서에 비유되어서 표현됩니다.

 

 

다형성

하나의 객체가 여러 개의 자료형 타입을 가질 수 있는 것을 다형성이라고 부릅니다.

 

 

추상클래스

추상클래스는 인터페이스의 역할도 하면서 구현체를 갖고 있습니다. 추상 클래스를 만들기 위해서는 abstract라는 키워드를 사용합니다.

추상 클래스는 인터페이스와 달리 추상 메서드 뿐만 아니라 실제 메소드도 추가할  수 있습니다. 추상 메서드는 공통된 부분에 대해서 정의를 해서 어디서든 사용할 수 있게 하는데 사용합니다.