객체지향프로그래밍
- 부품에 해당하는 객체들을 만들고, 그 객체를 조립해서 소프트웨어를 만드는 개발방식이다.
- 부품에 해당하는 객체를 생성하기 위한 설계도가 필요하다.
- 완성품 객체를 모델링하고, 집합관계에 있는 부품객체와 사용관계에 있는 객체들을 하나씩 설계 후 조립하는 방식으로 프로그램을 개발한다.
객체지향프로그래밍 언어의 주요 장점
- 코드의 재사용성이 높다
- 새로운 코드를 작성할 때 기존의 코드를 이용해서 쉽게 작성할 수 있다.(상속)
- 코드의 관리가 용이하다.
- 코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.(조립, 디자인패턴)
- 신뢰성이 높은 프로그래밍을 가능하게 한다.
- 접근제어자와 메소드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 한다.(캡슐화)
- 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다.(중복제거, 리팩토링)
객체지향프로그래밍의 주요 특징
- 캡슐화(Encapsulation)
- 객체의 실내 구현내용을 감추는 것이다.
- 다른 객체는 객체의 내부구조를 알 수 없고, 공개된 속성과 기능만을 이용할 수 있다.
- 잘못된 사용으로 인한 객체의 손상을 방지한다.
- 자바는 접근제어자를 사용해서 공개할 것인지, 숨길 것인지를 결정할 수 있다.
- 상속(Inheritance)
- 상속은 새로운 클래스(하위클래스)가 기존 클래스(상위클래스)의 필드와 메소드를 이용할 수 있게 하는 것이다.
- 상위클래스를 재사용하기 때문에 하위클래스를 빠르게 개발할 수 있다.
- 상위클래스를 상속받아서 다양한 프로그램의 요구에 대응할 수 있는 하위클래스를 개발할 수 있다.
- 상위클래스와 하위클래스는 종속관계를 형성함으로서 클래스들을 조직화할 수 있다.
- 다형성(Polymorphism)
- 같은 종류의 객체지만, 실행결과가 다양한 객체를 이용할 수 있는 성질이다.
- 사용하는 방법은 동일하지만, 실제 사용하는 객체가 바뀌면 실행결과가 다르게 발현되는 것이다.
- 사례
- 컴퓨터의 출력기능 사용하기
- 흑백프린터를 사용중 : 흑백인쇄물 출력
- 컬러프린터를 사용중 : 컬러인쇄물 출력
- 스마트폰의 노래듣기 기능 사용하기
- 이어폰 사용중 : 나만 노래를 듣는다
- 스피커 사용중 : 같은 공간의 모든 사람들이 노래를 듣는다
- 컴퓨터의 출력기능 사용하기
- 인쇄물을 출력하는 방법은 동일하지만, 사용중인 프린터(객체)에 따라서 결과가 다르게 나타난다. 이것이 다형성이다.
- 노래를 듣는 방법을 동일하지만, 실제 사용하는 장치에 따라서 결과가 다르게 나타난다. 이것이 다형성이다.
객체
실제로 존재하거나 추상적으로 생각할 수 있는 것이며, 다른 것과 식별가능한 것
- 실제로 존재하는 것
- 자동차, TV, 책 등
- 추상적으로 존재하는 것
- 개설과정, 계좌, 주문 등
객체는 자신의 고유한 속성과 기능을 가지고 있다.
- 자동차
- 속성 : 제조사, 모델명, 가격, 최고속도 등
- 기능 : 출발기능, 정지기능, 운전기능 등
- 주문
- 속성 : 주문번호, 고객명, 주문날짜, 주문상태 등
- 기능 : 조회하기, 취소하기, 반품하기 등
소프트웨어에서 객체는 각각 독립적으로 존재하며, 객체의 메소드를 통해서 상호작용한다.
객체는 클래스의 인스턴스다.(실제로 메모리상에 할당되는 것)
객체 간의 관계
객체는 개별적으로 사용할 수 있지만, 대부분 다른 객체와 관계를 맺고 있다.
- 집합관계(포함관계)
- 객체가 다른 객체의 부품으로 사용되는 관계이다.
- 사용관계(의존관계)
- 객체간의 사용작용을 의미하며, 객체가 다른 객체의 메소드를 호출해서 원하는 작업을 수행한다.
- 상속관계
- 상위객체(부모객체)를 기반으로 하위객체(자식객체)를 생성하는 관계이다.
- 상위객체는 종류(자동차, 스마트폰 등)를 의미하며, 하위객체는 구체적인 사물(아이폰15, 제네시스 등)에 해당한다.
클래스
- 객체는 설계도를 바탕으로 만들어진다.
- 자바에서 객체에 대한 설계도가 클래스(class)다.
- 클래스는 객체를 생성하기 위한 필드와 생성자, 메소드로 구성되어 있다.
- 필드(Field) : 객체의 데이터 저장
- 생성자(Constructor) : 객체 생성시 초기화 역할 담당
- 메소드(Method) : 객체의 기능에 해당하는 수행문의 코드 블록
- 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스(Instance)라고 한다.
- 클래스로부터 객체를 생성하는 과정을 클래스의 인스턴스화라고 한다.
객체지향프로그래밍 개발 단계
- 클래스 설계
- 클래스로 객체 생성
- 생성된 객체의 속성과 기능 이용하기
클래스의 설계
public class 클래스이름{
}
Ex)
public class Book{
}
객체 생성과 참조형 변수
객체 생성하기
형식
new 클래스명();
Ex)
참조변수 = new Book();
클래스명에 해당하는 객체를 생성하고, 생성된 객체의 주소값을 반환한다
반환되는 주소값은 생성된 객체를 이용하기 위해서 참조변수에 대입해야 한다
- new 연산자를 사용하면 클래스로부터 객체를 생성할 수 있다.
- 객체는 메모리의 힙(Heap)영역에 만들어진다.
- new 연산자는 메모리의 힙영역에 객체를 생성한 후, 메모리 내에서 객체의 위치를 알 수 있도록 객체의 주소값(메모리에서 객체가 위치하고 있는 주소)를 반환한다.
- new 연산자가 반환하는 주소값을 저장하기 위한 참조변수가 필요하다.
참조변수를 생성하고 객체의 주소값을 저장하기
형식
클래스명 참조변수명 = new 클래스명();
Ex)
Book book1 = new Book();
참조변수의 타입은 생성한 객체의 클래스명이다.
클래스명은 참조변수의 타입이다.
클래스는 사용자정의 데이터타입(자료형)이다.
- 참조변수는 생성된 객체의 주소값을 저장하는 변수다.
- 주소값이 저장된 참조변수는 힙영역에 생성된 객체를 참조하게 된다.
- 생성된 객체의 속성과 기능을 사용하기 위해서는 반드시 해당 객체를 참조하고 있는 참조변수를 사용해야 한다
Book book1 = new Book();
// Book book1은 Book 설계도로 생성한 객체의
// 주소값을 저장하는 참조변수 book1이다.
// new Book();은 new 키워드로 Book 객체를
// 생성하고 생성된 객체의 주소값을 반환한다.
// 아래와 같이 실행하면, Book 설계도를 이용해서 3개의 Book 객체가 생성된다
Book book2 = new Book();
Book book3 = new Book();
아래와 같이 서로 다른 참조변수로 같은 객체를 참조할 수도 있다.
Book book3 = new Book();
Book book4 = book3;
System.out.println("book3 : " + book3); // Book@7a81197d
System.out.println("book4 : " + book4); // Book@7a81197d
생성된 객체의 속성과 기능 이용하기
- 참조변수가 참조하는 객체는 그 객체의 속성과 기능을 사용할 수 있다.
- 참조변수가 참조하지 않는 객체는 사용할 수 없다.
- 생성된 객체의 속성과 기능을 사용하기 위해서는 반드시 참조변수에 객체의 주소값을 저장해두어야 한다.
아래와 같이 같은 객체라면 배열을 통해서도 저장 및 출력이 가능하다
객체 배열로 만든 객체의 속성 값들을 조건문을 이용해서 사용자의 입력에 따라 다른 값을 출력하는 코드
public class BookApp4 {
public static void main(String[] args) {
Book book1 = new Book();
Book book2 = new Book();
Book book3 = new Book();
book1.title = "이것이 자바다";
book1.author = "신용권";
book1.publisher = "한빛미디어";
book1.price = 36000;
book1.discountRate = 0.15;
book1.stock = 100;
book1.soldOut = false;
book2.title = "자바의 정석";
book2.author = "남궁성";
book2.publisher = "도우출판사";
book2.price = 32000;
book2.discountRate = 0.15;
book2.stock = 50;
book2.soldOut = false;
book3.title = "헤더 퍼스트 자바";
book3.author = "케이시 시에라";
book3.publisher = "한빛미디어";
book3.price = 28000;
book3.discountRate = 0.15;
book3.stock = 0;
book3.soldOut = true;
// Book 객체를 여러 개 저장하는 배열을 생성하고, 그 배열에 Book 객체를 담기
Book[] books = new Book[3];
books[0] = book1;
books[1] = book2;
books[2] = book3;
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("----------------------------------------------------");
System.out.println("1.재고현황 2.판매가능도서 3.판매완료도서 0.종료");
System.out.println("----------------------------------------------------");
System.out.println("### 메뉴선택 : ");
int menu = sc.nextInt();
if (menu == 1) {
System.out.println("### 도서현황을 출력합니다");
for (Book b : books) {
System.out.println(b.title + "\t" + b.price);
}
} else if(menu == 2) {
System.out.println("### 판매중인 책정보를 출력합니다");
for (Book b : books) {
if(b.soldOut == false) {
System.out.println(b.title + "\t" + b.price);
}
}
} else if(menu == 3) {
System.out.println("### 판매완료된 책정보를 출력합니다");
for (Book b : books) {
if(b.soldOut == true) {
System.out.println(b.title + "\t" + b.price);
}
}
} else if(menu == 0) {
System.out.println("### 프로그램을 종료합니다.");
break;
}
}
sc.close();
}
'Java' 카테고리의 다른 글
Java_생성자, 메소드 예시(oop) (0) | 2023.11.02 |
---|---|
Java_클래스와 메소드, 오버로딩(oop) (0) | 2023.11.01 |
Java_배열 [ Array ] (0) | 2023.10.27 |
Java_반복문(for문, while문) (0) | 2023.10.27 |
Java_조건문( if문과 switch문 ) (0) | 2023.10.26 |