-
학원 DAY7. 객체지향 프로그래밍기록 2022. 9. 17. 16:55
객체지향 프로그래밍이란?
- 부품에 해당하는 객체들을 만들고, 그 객체들을 조합해서 소프트웨어를 만드는 개발 방식이다.
- 부품에 해당하는 객체를 생성하기 위한 설계도가 필요하다.
- 완성품 객체를 모델링하고, 집합관계에 있는 부품객체와 사용관계에 있는 객체들을 하나씩 설계 후 조립하는 방식으로 프로그램을 개발한다. (모델링이란, 어떤 객체가 필요하고, 객체들 간의 조립은 어떻게 해야하는지 등을 설계하는 과정을 모델링이라고 한다.)
객체지향 프로그래밍 언어의 주요 장점
- 코드의 재사용성이 높다.
: 새로운 코드를 작성할 때 기존의 코드를 이용해서 쉽게 작성할 수 있다. (상속이라는 특징 때문에)
- 코드의 관리가 용이하다.
: 코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.(조립, 디자인패턴)
- 신뢰성이 높은 프로그래밍을 가능하게 한다.
: 접근제한자와 메소드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 한다.(캡슐화, 은닉화라는 특징) (공개된 올바른 기능을 통해서만 객체를 사용할 수 있게 함.)
: 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다.(중복제거, 리팩토링) (코드의 불일치란, 코드의 중복으로 인해 코드의 불일치가 생김, 코드가 중복되는 A,B,C 코드를 수정해야할 일이 생겼는데 A,B만 수정할 경우 생기는 문제)
객체지향프로그래밍의 주요 특징
가. 캡슐화(Encapsulation) :
- 객체의 실제 구현내용을 감추는 것이다. (은닉화)
- 다른 객체는 객체의 내부구조를 알 수 없고, 공개된 속성과 기능만을 이용할 수 있다.
- 잘못된 사용으로 인한 객체의 손상을 방지한다.
- 자바는 접근제한자를 사용해서 공개할 것인지, 숨길 것인 결정할 수 있다.
나. 상속(Inheritance) :
- 상속은 새로운 클래스(하위클래스)가 기존 클래스(상위클래스)의 필드와 메소드를 이용할 수 있게 하는 것이다.
- 상위클래스를 재사용하기 때문에 하위클래스를 빠르게 개발할 수 있다. (생산성 높임)
- 상위클래스를 상속받아서 다양한 프로그램의 요구에 대응할 수 있는 하위클래스를 개발할 수 있다.
- 상위클래스와 하위클래스는 종속관계를 형성함으로서 클래스들을 조직화할 수 있다. (종속관계에 있는 클래스는 비슷한 기능을 갖고 있다.)
다. 다형성(Polymorphism) :
- 같은 종류의 객체지만, 실행결과가 다양한 객체를 이용할 수 있는 성질이다.
- 사용하는 방법은 동일하지만, 실제 사용하는 객체가 바뀌면 실행결과가 다르게 발현되는 것이다. (확장성 높임)
- 사례 :
- 컴퓨터의 출력기능 사용하기
흑백프린터를 사용중 : 흑백인쇄물 출력
컬러프린터를 사용중 : 컬러인쇄물 출력
- 스마트폰의 노래듣기 기능 사용하기
이어폰 사용중 : 나만 노래를 듣는다.
스피커 사용중 : 같은 공간의 모든 사람들이 노래를 듣는다.
- 인쇄물을 출력하는 방법은 동일하지만, 사용중인 프린터(객체)에 따라서 결과가 다르게 나타난다. 이것이 다형성이다.
- 노래를 듣는 방법을 동일하지만, 실제 사용하는 장치에 따라서 결과가 다르게 나타난다. 이것이 다형성이다.
객체
- 물리적으로 존재하거나 추상적으로 생각할 수 있는 것이며, 다른 것과 식별가능한 것이다.
물리적으로 존재하는 것 : 자동차, TV, 책, 상품 등
추상적으로 존재하는 것 : 개설과정, 계좌, 주문 등
- 객체는 자신의 고유한 속성, 기능을 가지고 있다.
자동차
속성 : 제조사, 모델명, 가격, 최고속도
기능 : 출발기능, 정지기능, 운전기능
주문
속성 : 주문번호, 고객명, 주문날짜, 주문상태
기능 : 조회하기, 취소하기, 반품하기
- 소프트웨어에서 객체는 각각 독립적으로 존재하며, 객체의 메소드를 통해서 상호작용한다.
- 객체는 클래스의 인스턴스 (실제로 메모리상에 할당되는 것)이다. (메모리의 힙 영역에 객체가 만들어진다, 클래스를 객체로 만드는 것은 JVM이 자동으로 수행한다.)
- 하나의 클래스로 객체를 여러 개 만들 수 있다(<-재사용성). 동일한 클래스로 만들어져 있어도 그 객체는 다른 값을 가지고 있기 때문에 구별이 가능하다.
- 객체의 고유한 속성은 필드, 기능은 메소드라고 부른다. 대부분의 객체들은 기능은 노출되어 있고, 속성은 감춰져 있다. 공개된 기능을 통해서만 안의 속성을 변경할 수 있게 한다. 속성을 임의로 변경하지 못하도록 한다.
객체 간의 관계
객체는 개별적으로 사용할 수 있지만, 대부분 다른 객체와 관계를 맺고 있다.
- 집합관계(포함관계) : 객체가 다른 객체의 부품으로 사용되는 관계다.
- 사용관계(의존관계) : 객체간의 사용작용을 의미하며, 객체가 다른 객체의 메소드를 호출해서 원하는 작업을 수행한다.
- 상속관계 : 상위(부모)객체를 기반으로 하위(자식)객체를 생성하는 관계다.
상위객체는 종류(자동차류, 스마트폰류)를 의미하며, 하위객체는 구체적인 사물(제네시스, 산타페, 투산, iphone11, iphoneSE)에 해당한다.
클래스
- 객체는 설계도를 바탕으로 만들어진다.
- 자바에서 객체에 대한 설계도가 클래스(class)다.
- 클래스는 객체를 생성하기 위한 필드와 메소드로 구성되어 있다.
- 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스(Instance)라고 한다.
- 클래스로부터 객체를 생성하는 과정을 클래스의 인스턴스화라고 한다.
- 클래스 이름은 명사형인 경우가 대부분이며, 대문자로 시작한다.
- new 연산자를 사용하면 클래스로부터 객체를 생성할 수 있다.
객체의 생성과 참조형 변수
- new 연산자를 사용하면 클래스로부터 객체를 생성할 수 있다.
new 클래스명();
- 객체는 메모리의 힙(Heap)영역에 만들어진다.
- new 연산자는 메모리의 힙영역에 객체를 생성한 후, 메모리 내에서 객체의 위치를 알 수 있도록 객체의 주소값(메모리에서 객체가 위치하고 있는 주소)를 반환한다.
- new 연산자가 반환하는 주소값을 저장하기 위한 참조변수가 필요하다.
- 참조변수는 생성된 객체의 주소값을 저장하는 변수다.
- 참조변수의 타입은 해당 객체를 생성할 때 사용했던 클래스이름이다.
- 주소값이 저장된 참조변수는 힙영역에 생성된 객체를 참조하게 된다.
- 생성된 객체의 속성과 기능을 사용하기 위해서는 반드시 해당 객체를 참조하고 있는 참조변수를 사용해야 한다.
(생성된 객체의 속성과 기능을 사용하기 위해서는 반드시 참조변수에 객체의 주소값을 저장해두어야 한다.)
- 하나의 객체를 2개의 참조변수가 참조하게 하는 것은 가능하다. 하지만 참조변수 1개가 2개의 객체를 참조하는 것은 불가능하다.
클래스의 구성요소 ( 필드, 생성자, 메소드 )
- 필드 : 객체의 고유한 데이터 저장
- 생성자 : 객체 생성시 초기화 역할 담당
- 메소드 : 객체의 기능에 해당하는 수행문의 코드 블록
필드(Field)
- 객체의 고유 데이터, 현재 상태정보, 부품객체를 저장하는 곳이다.
- 객체의 고유한 속성을 나타낸다.
- 변수와 같은 형태로 정의한다.
- 필드는 초기화값을 지정하지 않는 경우 해당 테이터타입의 기본값으로 초기화된다.
- 필드는 생성자와 메소드 전체에서 사용가능하다.
- 객체 소멸되지 않는 한 객체와 함께 유지된다.
- 필드를 만들면 객체의 메모리 안에 변수의 형태로 저장된다.
- 서로 연관되어 있는 정보는 하나의 객체 안에 담을 것이다.
Book객체 하나만 만들면 책 정보 하나를 온전히 담을 수 있게 되는 것이다.
그것이 클래스를 정의하고 객체를 생성하는 첫 번째 목적이 되는 것이다.
+)
- 객체를 생성하면 객체안에 있는 변수는 해당 데이터타입의 기본값으로 초기화된다. (byte, short, int, long은 0, float, double은 0.0, char는 ‘\u0000', boolean은 false값으로 초기화된다. 위의 기본 자료형 타입을 제외한 나머지는 전부 null값으로 초기화된다.)
- null은 참조변수가 객체를 참조하고 있지 않을 때 가지는 값이다.
- 실행오류 : 실행해보니까 생기는 오류 (이클립스에 빨간줄 없음. 문법적으로 잘못된 것 없음)
- NullPointerException : NULL이 대입되어 있는 참조변수로 객체에 접근하려고 할 때 발생하는 오류
- 객체의 조립이란, 객체의 주소값을 대입시키는 것이다. 주소값을 갖는 순간 참조한다.
참조한다는 의미는 그 객체의 공개된 기능, 속성을 사용할 수 있다는 것을 의미한다.
'기록' 카테고리의 다른 글
학원 DAY9. 메소드의 매개변수, 반환타입, 메소드 중복정의(오버로딩) (0) 2022.09.17 학원 DAY8. 메소드 (0) 2022.09.17 DAY6. 향상된 FOR문 (Enhanced-for문) (0) 2022.09.09 DAY6. 배열 (0) 2022.09.09 DAY6. while문 (0) 2022.09.09