본문 바로가기
Java

Java_객체지향프로그래밍 (oop)

by 유서담 2023. 11. 1.

객체지향프로그래밍

 

  • 부품에 해당하는 객체들을 만들고, 그 객체를 조립해서 소프트웨어를 만드는 개발방식이다.
  • 부품에 해당하는 객체를 생성하기 위한 설계도가 필요하다.
  • 완성품 객체를 모델링하고, 집합관계에 있는 부품객체와 사용관계에 있는 객체들을 하나씩 설계 후 조립하는 방식으로 프로그램을 개발한다.

 

객체지향프로그래밍 언어의 주요 장점

 

  • 코드의 재사용성이 높다
    • 새로운 코드를 작성할 때 기존의 코드를 이용해서 쉽게 작성할 수 있다.(상속)
  • 코드의 관리가 용이하다.
    • 코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.(조립, 디자인패턴)
  • 신뢰성이 높은 프로그래밍을 가능하게 한다.
    • 접근제어자와 메소드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 한다.(캡슐화)
    • 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다.(중복제거, 리팩토링)

 

객체지향프로그래밍의 주요 특징

 

  • 캡슐화(Encapsulation)
    • 객체의 실내 구현내용을 감추는 것이다.
    • 다른 객체는 객체의 내부구조를 알 수 없고, 공개된 속성과 기능만을 이용할 수 있다.
    • 잘못된 사용으로 인한 객체의 손상을 방지한다.
    • 자바는 접근제어자를 사용해서 공개할 것인지, 숨길 것인지를 결정할 수 있다.
  • 상속(Inheritance)
    • 상속은 새로운 클래스(하위클래스)가 기존 클래스(상위클래스)의 필드와 메소드를 이용할 수 있게 하는 것이다.
    • 상위클래스를 재사용하기 때문에 하위클래스를 빠르게 개발할 수 있다.
    • 상위클래스를 상속받아서 다양한 프로그램의 요구에 대응할 수 있는 하위클래스를 개발할 수 있다.
    • 상위클래스와 하위클래스는 종속관계를 형성함으로서 클래스들을 조직화할 수 있다.
  • 다형성(Polymorphism)
    • 같은 종류의 객체지만, 실행결과가 다양한 객체를 이용할 수 있는 성질이다.
    • 사용하는 방법은 동일하지만, 실제 사용하는 객체가 바뀌면 실행결과가 다르게 발현되는 것이다.
    • 사례
      • 컴퓨터의 출력기능 사용하기
        • 흑백프린터를 사용중 : 흑백인쇄물 출력
        • 컬러프린터를 사용중 : 컬러인쇄물 출력
      • 스마트폰의 노래듣기 기능 사용하기
        • 이어폰 사용중 : 나만 노래를 듣는다
        • 스피커 사용중 : 같은 공간의 모든 사람들이 노래를 듣는다
    • 인쇄물을 출력하는 방법은 동일하지만, 사용중인 프린터(객체)에 따라서 결과가 다르게 나타난다. 이것이 다형성이다.
    • 노래를 듣는 방법을 동일하지만, 실제 사용하는 장치에 따라서 결과가 다르게 나타난다. 이것이 다형성이다.

 

 

객체

 

 

실제로 존재하거나 추상적으로 생각할 수 있는 것이며, 다른 것과 식별가능한 것

  • 실제로 존재하는 것
    • 자동차, TV, 책 등
  • 추상적으로 존재하는 것
    • 개설과정, 계좌, 주문 등

객체는 자신의 고유한 속성과 기능을 가지고 있다.

  • 자동차
    • 속성 : 제조사, 모델명, 가격, 최고속도 등
    • 기능 : 출발기능, 정지기능, 운전기능 등
  • 주문
    • 속성 : 주문번호, 고객명, 주문날짜, 주문상태 등
    • 기능 : 조회하기, 취소하기, 반품하기 등 

소프트웨어에서 객체는 각각 독립적으로 존재하며, 객체의 메소드를 통해서 상호작용한다.

객체는 클래스의 인스턴스다.(실제로 메모리상에 할당되는 것)

 

 

객체 간의 관계

 

객체는 개별적으로 사용할 수 있지만, 대부분 다른 객체와 관계를 맺고 있다.

  • 집합관계(포함관계)
    • 객체가 다른 객체의 부품으로 사용되는 관계이다.
  • 사용관계(의존관계)
    • 객체간의 사용작용을 의미하며, 객체가 다른 객체의 메소드를 호출해서 원하는 작업을 수행한다.
  • 상속관계
    • 상위객체(부모객체)를 기반으로 하위객체(자식객체)를 생성하는 관계이다.
    • 상위객체는 종류(자동차, 스마트폰 등)를 의미하며, 하위객체는 구체적인 사물(아이폰15, 제네시스 등)에 해당한다.

 

 

클래스

 

  • 객체는 설계도를 바탕으로 만들어진다.
  • 자바에서 객체에 대한 설계도클래스(class)다.
  • 클래스는 객체를 생성하기 위한 필드생성자, 메소드로 구성되어 있다.
    • 필드(Field) : 객체의 데이터 저장
    • 생성자(Constructor) : 객체 생성시 초기화 역할 담당
    • 메소드(Method) : 객체의 기능에 해당하는 수행문의 코드 블록
  • 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스(Instance)라고 한다.
  • 클래스로부터 객체를 생성하는 과정을 클래스의 인스턴스화라고 한다.

 

객체지향프로그래밍 개발 단계

 

  1. 클래스 설계
  2. 클래스로 객체 생성
  3. 생성된 객체의 속성과 기능 이용하기

 

 

클래스의 설계

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