멀리 보는 연습

JAVA_객체 지향 프로그래밍 본문

Study/JAVA

JAVA_객체 지향 프로그래밍

푸실리 2021. 7. 3. 18:54

 

1. 클래스와 객체 관련 용어 정리 

 

** 클래스(Class)

'설계도'라고도 표현하며, 데이터 타입의 한 종류이다. 어떤 데이터를 가지고 있고 어떤 기능을 하는지 등등을 설계하는 것. 영화 예매 시스템을 예로 들자면 극장, 영화, 고객, 버튼, 파일, 이미지 등을 객체로 만든다. 뿐만 아니라 눈으로 보이지 않는 시간처럼 계산적인 것들도 가져다 쓰기 쉽게 객체로 만든다.

 

1) 데이터(Attribute, 속성, Field)

이름, 키, 나이, 성별 등

 

2) 로직(Behavior, 행동, 기능, Method)

걷다, 먹다, 자다, 말하다 등

 

 

** 오브젝트(Object, 객체) >> Created from the class

설계도(클래스)를 보고 집을 만들었다면, 집이 바로 오브젝트 즉 객체가 된다. new 라는 키워드로 설계도(클래스)를 불러내서 오브젝트를 만든다. 데이터 안에 각자 공간을 할당 받아서 움직이는 객체

 

 

** 생성자

생성자는 메소드로, 생성자의 이름은 클래스 이름과 동일하다. 리턴 타입을 지정할 수 없고, new를 통해 객체를 생성할 때만 호출된다. 생성자는 하나 이상 선언되어야 한다. 만약 개발자가 생성자를 선언하지 않으면, 컴파일러가 자동으로 기본 생성자(default constructor)를 선언해준다. 

 

* 메소드에서의 생성자

예시 > public Student() {}

 

* 메인에서의 생성자

Student stu2 = new Student();
Student();  >> 생성자 부분

 

그렇다면 메인에서 그냥 변수를 선언하지 않고 생성자를 통해 생성하는 이유는 무엇일까?

생성자를 통해 생성할 경우 생성자에 조건을 걸면 그 조건에 맞게 제어할 수 있지만 그냥 변수를 선언하게 되면 제어가 불가능하다는 단점이 있기 때문이다. 

 

 

** ArrayList

ArrayList는 파이썬의 List와 동일한 기능을 하는 배열로, 그 크기를 자유롭게 늘리고 줄일 수 있어 편리하다.

추가 - list.add()
꺼내기 - list.get()
삭제 - list.remove()

 

 

2. 객체 지향 프로그래밍의 장점

- 신뢰성 있는 소프트웨어를 쉽게 작성

- 코드 재사용이 용이

- 유지 보수가 용이

- 직관적인 코드 분석이 가능

- 소프트웨어 생산성이 향상

 

3. 객체 지향 프로그래밍의 특징★★★★★

1) 추상화

- 대상들이 가지고 있는 공통된 속성과 행위를 추출하며, 상세한 정보는 무시하고 필요한 정보들만 간추림

ex_학생기록부에는 학생의 요리 능력이나 취미가 불필요하다.

- 코드 상에서 구현(로직)부분을 제외한 오직 선언 부분만을 설계

 

2) 캡슐화

추상화를 통해 모은 데이터와 로직을 모아 놓은 것. 관련된 필드와 메소드를 하나로 묶고, 실제 구현 내용을 외부로부터 감추는 기법(정보 은닉). 만일의 상황(타인이 외부에서 조작하는 등의 상황)을 대비해서 특정 속성이나 메소드를 사용자가 조작할 수 없도록 숨겨놓은 것. Public 과 Private와 같은 접근 제한자를 예로 들 수 있다. 외부에서는 공개된 메소드의 인터페이스를 통해 접근할 수 있다.  

 

3)상속

이미 작성된 상위 클래스의 특성을 그대로 이어받아 새로운 하위 클래스를 생성하는 기법. 기존 코드를 그대로 재사용하거나 재정의함. 먼저 작성된 검증된 메소드를 사용. 또한 추상화를 통해 모은 공통점을 모아서 만든 상위 클래스를 통해 효율적으로 관리한다. 

- 상위 클래스 : 부모 클래스, 슈퍼클래스(공식 명칭), 개념적 특징 정의

- 하위 클래스 : 자식 클래스, 서브클래스(공식 명칭), 구체적 행위 구현

 

** 상속 문법의 특징

1) 자바에서는 다중 상속을 지원하지 않는다. 

- 하나의 슈퍼 클래스만 가질 수 있음

- 슈퍼클래스가 2개 이상이 되면 2개의 클래스에서 중복되는 메소드가 있을 때 복잡해지기 때문에 그런 점을 방지하기 위해 단일 상속만 지원

- Object는 최상위 클래스이기 때문에 중복 상속 문제와는 관련이 없다.

Ex_ Object> 마우스 > 휠마우스

 

2) 상속 횟수에는 제한이 없다.

중복 상속은 허용하지 않지만 직렬 구조의 상속 횟수는 제한이 없다.

 

3) 모든 클래스의 최상위 클래스는 Object 이다.

상속을 별도로 설정하지 않아도, object 클래스에서 기본으로 상속되는 메소드들이 존재.

 

4)다형성

상속을 베이스로 두고 똑같은 이름의 클래스, 메소드를 통해 여러 기능을 구현하는 것. 같은 이름의 클래스, 메소드를 이용해 다양한 결과를 표현하도록 해주는 특징을 가진다. 

 

** 장점 : 개발자의 편의성 증가, 유지보수 용이, 생산성 증대

 

** 클래스 활용 다형성 조건 

1) 상속

 

2) 업캐스팅, 다운캐스팅

** 캐스팅 = 형변환

데이터 타입의 형변환은 강제 형변환과 자동 형변환으로 나뉘는데, 큰 데이터 타입을 작은 데이터 타입에 넣으려면 강제 형변환이 필요하지만 반대의 경우 자동으로 형변환이 가능하다. 이와 마찬가지로 부모 자식의 상속 관계에 있는 클래스에서도 형변환이 이루어진다. 업캐스팅과 다운캐스팅으로 나뉘는데, 하위 클래스가 상위 클래스가 되는 것은 업 캐스팅, 상위 클래스가 하위 클래스가 되는 것은 다운 캐스팅이다.

 

** 업캐스팅

Ex_마우스 m = new 휠마우스();

처음에 클래스를 부를 때 휠마우스를 부른 게 아니라 마우스르 불렀기 때문에, 거기에 담긴 휠마우스는 고유 기능인 스크롤 기능을 제대로 사용할 수 없다. 이 때, 휠마우스의 본질 기능인 스크롤 기능은 사라지는 것은 아니다. 그러나 스크롤 기능을 제외한 오른쪽 클릭과 왼쪽 클릭은 동적 바인딩 원칙에 따라 모두 휠마우스의 기능을 따른다. 

 

(동적 바인딩 : 컴파일 시점에서 실행할 메소드를 결정하지 않고, 실행 시점에 실행할 메소드를 결정)

 

 

** 다운 캐스팅

Ex_ 휠마우스 wm = (휠마우스)m;

마우스인 m을 휠마우스에 담아서 스크롤 기능까지 시킬 수 있다. 

 

3) 메소드 오버라이딩

상위 클래스로부터 물려받은 메소드를 하위 클래스가 재정의하는 것.

중괄호 안에는 어떻게 쓰던지 상관 없지만, public void right click() 처럼 메소드 반환형 이름은 반드시 부모와 똑같이 써야 한다. 

 

** 오픈 클로즈 원칙 

기능이 확장되는 부분에는 최대로 오픈하되, 그 기능을 받아 들일 때 소스를 건드리는 것은 최대한 폐쇄적으로 최소화하자는 원칙

 

 

4) 추상 클래스, 추상 메소드

추상 클래스 : 실제 구현 내용은 없는 메소드를 하나라도 담은 클래스, abstract를 반드시 선언해야 함. 

     추상 메소드(미완성 메소드) : 실제 구현 내용은 없는 메소드, abstract를 반드시 선언해야 함. 

 

↑한개라도 미구현된 메소드가 있다면 미구현된 클래스라고 표기해야한다.(abstract)

 

** 장점

- 미구현된 클래스는 객체 생성이 불가하다.

- 추상화된 클래스를 상속받는 하위클래스는 미구현된 메소드를 구현시킬 의무가 생긴다. 

미구현된 메소드르 구현하지 않으면 위와 같은 에러 메시지가 뜬다. 

 

 

5) 인터페이스

인터페이스는 다중 구현 상속이 가능한 구현 시스템이다. 상수와 추상 메소드로 구성되며, 상수로 구성되기 때문에 Public static final을 사용한다. (final = 상수)

static은 프로그램이 실행될 때 메소드를 별도로 생성하지 않아도 사용 가능하게 해준다.

Public abstract >> 기능이 없는 추상 메소드, 일반 메소드도 추상 가능함.

 

 

위 문제 및 관련 내용은 스마트인재개발원에서 진행되었습니다.

https://www.smhrd.or.kr/

Comments