객체지향프로그래밍 개념4

지선·2023년 4월 20일

OOP(Object-Oriented Programming)

==객체지향프로그래밍
객체를 기반으로 프로그래밍을 작성하는 언어
부품 객체 만들고 하나씩 조립

OOP목적

  1. 소프트웨어의 생산성 향상
    컴퓨터 산업 발전에 따라 소프트웨어의 생명 주기 단축(빠른 속도로 생산,수정 가능해야함)
    ->상속, 다형성, 객체, 캡슐화 등 소프트웨어 재사용을 위한 여러 장치 내장, 소프트웨어의 재사용과 부분 수정이 빠름, 다시 만들어야 하는 부담 대폭 줄임, 생산성 향상
  2. 실세계에 대한 쉬운 모델링
    초기 시대에는 수학계산/통계 등 처리 과정과 계산 절차가 중요했다면
    현대에는 컴퓨터가 산업 전반에 활용되면서 실세계에서 발생하는 일을 프로그래밍을 해야함, 실세계의 문제 절차나 과정보다 문제를 분석하고 구현 대상 및 관계를 파악해야함
    -> 실세계의 일을 보다 쉽게 프로그래밍하기 위한 객체 중심적 언어, 요구사항분석을 바탕으로 객체의 표현 및 상호 작용을 묘사하는 것이 용이함

OOP 특성 3R

  1. 가독성
  2. 재사용성
  3. 신뢰성

OOP가 가져야 할 속성

  1. 상속성
    '하위객체'는 '상위객체'이다. 로 표현 가능
    ex) 사람은 동물이다 (O), 동물은 사람이다(X)
    공통 부분을 재사용할 수 있게 만들어줌
    여러 객체를 설계하면서, 일반화개념(공통, 공유)이 발견되었거나 새로운 객체를 정의할 때 기존 설계도를 재사용하는 목적으로 사용
    하위 객체는 상위에서 허용한 모든 멤버를 물려받아 사용
    상위 객체에서 정의하지 않은 새로운 멤버의 추가, 확장, 수정 가능
    필요하다면 하위객체가 상위객체에서 물려받은 메소드를 재정의도 가능
    조건: 일반화가 가능해야하다
    물리적으로 개념적으로 '-이다'의 관계가 성립되고 타당할 때만 사용
    ex)사람은 동물이다. 사람은 동물의 종류이다. 사람은 동물로 참조할 수 있다.
    그렇지만 단순히 공통 부분이 있다고 사용하는건 x
    상속대상: 상위개체에서 허용한 멤버(속성과 일반 메소드), 생성자는 물려받지 x

그렇다면 자바에서 상속은?
단위 상속만 허용
하위 클래스가 상위 클래스가 허용한 멤버(속성,메소드)를 물려받고 기능을 확장함
여러 개의 하위 객체를 일반화 시켜 참조 가능, 기존에 만들어진 상위 객체를 재사용해서 하위 객체를 빠르게 개발 가능-> 반복된 코드의 중복을 줄이고, 유지 보수의 편리성으 제공하며, 객체의 다형성을 구현할 수 o

  1. 은닉성(캡슐화): 약속되지 않은, 보여줄 필요가 없는 부분은 감싸서 숨기는것
    객체의 필드, 메소드를 하나로 묶고, 실제 구현 내용을 감추는 것
    외부 객체는 객체 내부의 구조를 알지 못한다.
    객체가 노출해 제공하는 필드와 메소드만 이용 가능
    -접근제한자(Access Modifier) 사용: public/private/protected
    -private속성 공유하고 싶을 때는 getter/setter이용
    왜 사용할까? 외부의 잘못된 사용으로 객체가 손상되지 않도록 보호하고, 캡슐화된 멤버를 노출시킬 것인지 숨길것인지 결정하기 위하여

그렇다면 자바에서의 캡슐화는?
클래스와 객체로 이루어짐
클래스: 객체 모양을 선언한 툴(캡슐화)-붕어빵 틀
메소드(멤버 함수)와 필드(멤버 변수)는 모두 클래스 내에 구현
객체: 클래스 모양대로 생성된 실체(instance)-초코붕어빵,팥 붕어빵,슈크림 붕어빵
객체 내부 데이터를 보호하고 외부 접근을 제한한다. (객체 외부에서는 비공개 멤버(필드, 메소드)에 직접 접근할 수 x,접근이 필요하면 공개된 메소드(getter,setter등)를 통해 접근할 수 o)

  1. 다형성
    같은 이름의 메소드나 클래스가 객체에 따라 다르게 동작하도록 구현
    -메소드 오버로딩: 같은 이름이지만, 인자의 형태와 수에 따라 optional하게 동작하도록
    -메소드 오버라이딩: 슈퍼클래스에서 상속받은 메소드를 서브 클래스마다 각자 다르게 구현하는것
    -인터페이스: 메소드만 정의한 클래스, 기능 명시함
    interface만들면 객체의 사용법 쉽게 파악 가능, 객체의 임무 명시 가능, interface타입으로 참조 가능->각 객체가 반드시 구현해야 할 동작을 명시해야 할 때, 객체 전체가 아니라 객체의 기능으로 접근해야 한다면 interface를 사용함.
    이 타입에는 하위에 연결된 모든 구현 객체가 대입될 수 있으며, 기능별로 부품화 시켜 연결시킬 수 o, 서로 다른 상속 트리의 객체 연결가능, JAVA9부터는 default메소드가 가능하여 유지보수 용이

그렇다면 자바에서의 다형성은?
객체에 따라 같은 메소드를 이용해 다양한 동작 구현 가능, 이름 다르게 만들지 않아도 o, 공통 메소드 이름을 사용함으로써 직관적인 사용과 반복기능 o
메소드 오버로딩, 메소드 오버라이딩, 인터페이스를 활용, 어떤 메소드가 실행될지는 실행 중 동적으로 바인딩 됨

객체

고유한 특성&행동을 가짐
다른 객체와 상호작용하며 존재
ex) 게임에서 캐릭터와 무기, 아이템들, 테트리스 게임의 각 블록들, 한글 프로그램의 메뉴나 버튼들

OOP 속 객체

개념상-어떤 일을 처리하기 위한 데이터(변수, 속성, 필드)와 기능(메소드, 함수)을 하나로 묶어놓은 개념을 구체화 한 단위
문법상-변수+메소드, C구조체에 함수가 추가된 구조

클래스와 객체

클래스: Car.java, 강아지.java
클래스==객체를 위한 설계도(필드+메소드를 위한 설계도), 객체를 생성하기 위한 필드와 메소드가 정의됨->객체의 속성과 행동이 포함됨

클래스로 만들어진 객체를 해당 클래스의 인스턴스라고 부름, 하나의 클래스로부터 여러 개의 인스턴스를 만들 수 o

객체: 클래스의 인스턴스
클래스의 모양 그대로 찍어낸 실체, 프로그램 실행 중 생성되는 실체, 메모리 공간을 갖는 구체적인 실체

ex) 클래스: 사람 - 객체: 나, 엄마, 아빠, 언니
클래스: 붕어빵틀 - 객체: 팥붕, 슈붕 등

객체는 클래스에 선언된 동일한 속성을 가지지만, 객체마다 서로 다른 고유한 값으로 구분

클래스 이름

한글이름 가능하나 대부분 영어 이름으로 작성
클래스 이름은 대문자로 시작 (알파벳 대소문자 다른 문자로 인식)
첫 글자와 연결된 다른 단어의 첫 글자 역시 대문자로 작성
1. 하나 이상의 문자
2. 첫 번재 글자는 숫자 x
3. $,_ 이외의 특수 문자 사용x
4. 자바 키워드 사용 x

클래스 선언과 컴파일

소스 파일 생성: 클래스이름.java(클래스 이름은 대문자로 !!!)
소스 작성하고 컴파일을 javac.exe로 돌리면 클래스이름.class (바이트 코드)가 만들어짐
하나의 파일에서 두 개 이상의 클래스 선언이 가능하지만 한개씩 쓰기
소스 파일 이름과 동일한 클래스만 public으로 선언 가능, 선언 개수만큼 바이트 코드 파일 생성

클래스의 구성


클래스의 멤버: 클래스의 필드(변수)와 메소드

int a로 설명해보자면
int는 변수 a를 위한 클래스, a는 int의 인스턴스인 객체
int를 실체화 한 변수인 a를 우리는 사용할 수 o

Circle c;//c라는 객체 선언 (Circle 클래스의 인스턴스)
Circle d= new Circle();//Circle클래스 모양의 객체를 생성한 후 ! Circle 변수 d에 저장
실제 메모리 영역에서 Circle에 필요한 만큼의 메모리를 할당 받고 ! d가 그 영역을 참조한다

객체는 반드시 new 키워드를 사용하여 선언 (new는 객체의 생성자 호출)
객체 생성 과정
1. 객체에 대한 레퍼런스 변수를 선언한다.
2. 객체를 생성한다. (클래스 타입의 크기의 메모리가 할당되며 객체 내 생성자 코드 실행)
접근하는 법: 객체레퍼런스변수.멤버

생성자

객체가 생성될 때 초기화를 위해 실행되는 메소드
특징
1. 특별한 메소드로서, 리턴타입이 없다.
2. 객체를 생성할 때 초기화하기 위한 목적으로 사용한다.
3. 생성자는 new를 통해 개체를 생성할 때 한 번 호출된다. 반드시 호출된다.
4. 클래스 내에서 하나 이상 선언되어야 한다.
5. 개발자가 생성자를 생성하지 않는다면, 컴파일러가 자동으로 기본 생성자를 삽입한다.
강아지 a=new 강아지(); //생성자 호출
강아지 b=new 강아지("양숑숑");//이름을 '양숑숑'으로 설정할 수 있는 생성자를 오버로딩 한 것
!!! 생성자 이름은 반드시 클래스 이름과 동일해야한다 !!!
생성자는 필요에 따라 여러 개 작성이 가능하다->메소드 오버로딩

기본 생성자: 매개 변수x, 아무 작업 없이 단순 리턴, 디폴트 생성자라고 부르기도 함
기본 생성자를 꼭 넣어두자 왜냐면 개발자가 생성자를 하나라도 만들면 자동생성이 되지 않기 때문=기본 생성자를 만들지 않고, 생성자를 만들어서 기본 생성자를 호출한다면 컴파일 오류가 생김
또, 상속되었을 때 생성자는 상속이 되지 않는다는거 기억하기!

this 레퍼런스: 객체(인스턴스)자신의 참조주소를 갖는 레퍼런스
컴파일러에 의해 자동으로 관리, thie.멤버 형태로 멤버를 사용
객체 내부에서 인스턴스 멤버임을 명확하게 해주며
매개변수와 필드 이름이 같을 때, 구분이 명확하다.
다른 메소드를 호출 할 때 객체 자신의 레퍼런스를 전달하거나 반활할 때 유용하다.

객체 배열

객체를 담은 배열공간을 만들고 각 배열공간에 생성한 객체의 주소를 저장한다
생성과정은 일반배열과 같음

profile
긍정왕되기

0개의 댓글