2021. 03. 29(월) TIL

Dylan·2021년 3월 29일
0

Java

비교

정수, 실수, 캐릭터, 불린값을 제외하고는 전부 객체 주소값을 가지고 있다.

import java.util.Scanner;

public class StringDemo2 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		String value1 = "홍길동";
		
		System.out.print("이름을 입력하세요 : ");
		String value2 = sc.next();
		
		// == 비교 연산자로 문자열 비교
		// value1변수의 주소값과 value2변수의 주소값을 비교한다.
		// (서로 다른 객체의 주소값을 가지고 있으므로 false)
		System.out.println(value1 == value2);
		
		// String객체는 문자열의 내용을 비교할 수 있는 equals(다른 문자열) 메소드를 제공한다.
		// value1변수가 참조하는 객체와 value2변수가 참조하는 객체가 동일한 내용을 가지고 있으면
		// 객체의 주소값에 상관없이 true가 나온다
		System.out.println(value1.equals(value2));
		System.out.println(value2.equals(value1));
		
		sc.close();
	}
}

객체지향 프로그래밍

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

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

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

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

  • 캡슐화(Encapsulation)

    • 객체의 실제 구현내용을 감추는 것이다.
    • 다른 객체는 객체의 내부구조를 알 수 없고, 공개된 속성과 기능만을 이용할 수 있다.
    • 잘못된 사용으로 인한 객체의 손상을 방지한다.
    • 자바는 접근제한자를 사용해서 공개할 것인지, 숨길 것인 결정할 수 있다.
  • 상속(Inheritance)

    • 상속은 새로운 클래스(하위클래스)가 기존 클래스(상위클래스)의 필드와 메소드를 이용할 수 있게 하는 것이다.
    • 상위클래스를 재사용하기 때문에 하위클래스를 빠르게 개발할 수 있다.
    • 상위클래스를 상속받아서 다양한 프로그램의 요구에 대응할 수 있는 하위클래스를 개발할 수 있다.
    • 상위클래스와 하위클래스는 종속관계를 형성함으로서 클래스들을 조직화할 수 있다.
  • 다형성(Polymorphism)

    • 같은 종류의 객체지만, 실행결과가 다양한 객체를 이용할 수 있는 성질이다.
    • 사용하는 방법은 동일하지만, 실제 사용하는 객체가 바뀌면 실행결과가 다르게 발현되는 것이다.
    • 사례
      • 컴퓨터의 출력기능 사용하기
        • 흑백프린터를 사용중 : 흑백인쇄물 출력
        • 컬러프린터를 사용중 : 컬러인쇄물 출력
      • 스마트폰의 노래듣기 기능 사용하기
        • 이어폰 사용중 : 나만 노래를 듣는다.
        • 스피커 사용중 : 같은 공간의 모든 사람들이 노래를 듣는다.
    • 인쇄물을 출력하는 방법은 동일하지만, 사용중인 프린터(객체)에 따라서 결과가 다르게 나타난다. 이것이 다형성이다.
    • 노래를 듣는 방법을 동일하지만, 실제 사용하는 장치에 따라서 결과가 다르게 나타난다. 이것이 다형성이다.

객체

  • 물리적으로 존재하거나 추상적으로 생각할 수 있는 것이며, 다른 것과 식별가능한 것이다.
    • 물리적으로 존재하는 것
      • 자동차, TV, 책, 상품 등
    • 추상적으로 존재하는 것
      • 개설과정, 계좌, 주문 등
  • 객체는 자신의 고유한 속성기능을 가지고 있다.
    • 자동차
      • 속성 : 제조사, 모델명, 가격, 최고속도
      • 기능 : 출발기능, 정지기능, 운전기능
    • 주문
      • 속성 : 주문번호, 고객명, 주문날짜, 주문상태
      • 기능 : 조회하기, 취소하기, 반품하기
  • 소프트웨어에서 객체는 각각 독립적으로 존재하며, 객체의 메소드를 통해서 상호작용한다.
  • 객체는 클래스의 인스턴스(실제로 메모리상에 할당되는 것)다.

객체 간의 관계

  • 객체는 개별적으로 사용할 수 있지만, 대부분 다른 객체와 관계를 맺고 있다.
  • 집합관계(포함관계)
    • 객체가 다른 객체의 부품으로 사용되는 관계다.
  • 사용관계(의존관계)
    • 객체간의 사용작용을 의미하며, 객체가 다른 객체의 메소드를 호출해서 원하는 작업을 수행한다.
  • 상속관계
    • 상위(부모)객체를 기반으로 하위(자식)객체를 생성하는 관계다.
    • 상위객체는 종류(자동차류, 스마트폰류)를 의마하며, 하위객체는 구체적인 사물(제네시스, 산타페, 투산, iphone11, iphoneSE)에 해당한다.

객체와 클래스

클래스

  • 객체는 설계도를 바탕으로 만들어진다.
  • 자바에서 객체에 대한 설계도클래스(class)다.
  • 클래스는 객체를 생성하기 위한 필드(멤버변수)메소드로 구성되어 있다.
  • 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스(Instance)라고 한다.
  • 클래스로부터 객체를 생성하는 과정을 클래스의 인스턴스화하고 한다.

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

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

객체의 생성과 참조형 변수

  • new 연산자를 사용하면 클래스로부터 객체를 생성할 수 있다.
  new 클래스명();
  • 객체는 메모리의 힙(Heap)영역에 만들어진다.
  • new 연산자는 메모리의 힙영역에 객체를 생성한 후, 메모리 내에서 객체의 위치를 알 수 있도록 객체의 주소값(메모리에서 객체가 위치하고 있는 주소)를 반환한다.
  • new 연산자가 반환하는 주소값을 저장하기 위한 참조변수가 필요하다.
  // 객체 생성하기
  클래스명 참조변수;
  참조변수 = new 클래스명();

  // 참조변수 선언, 객체 생성
  Car myCar;
  myCar = new Car();

  Book book1;
  book1 = new Book();
  Book book2 = null;
  book2 = new Book();

  // 참조변수 선언 및 객체 생성
  클래스명 참조변수 = new 클래스명();
  
  Car yourCar = new Car();
  Book book3 = new Book();
  • 참조변수는 생성된 객체의 주소값을 저장하는 변수다.

  • 참조변수의 타입은 해당 객체를 생성할 때 사용했던 클래스이름이다.

  • 주소값이 저장된 참조변수는 힙영역에 생성된 객체를 참조하게 된다.

  • 생성된 객체의 속성과 기능을 사용하기 위해서는 반드시 해당 객체를 참조하고 있는 참조변수를 사용해야 한다.

생성된 객체의 속성과 기능 이용하기

  • 참조변수가 참조하는 객체는 그 객체의 속성과 기능을 사용할 수 있다.
  • 참조변수가 참조하지 않는 객체는 사용할 수 없다.
  • 생성된 객체의 속성과 기능을 사용하기 위해서는 반드시 참조변수객체의 주소값을 저장해두어야 한다.

출처 : https://github.com/eungsu/documents

package day1;

public class Book {
	
	// 필드 정의하기(제목, 저자, 출판사, 가격)
	// 생성된 객체의 고유한 속성(값)을 저장하는 멤버변수가 된다.
	String title;
	String writer;
	String publisher;
	int price;
	int discountPrice;
	
	// 메소드 정의하기
	// 생성된 객체의 고유한 기능이 된다.
	// 메소드는 생성된 객체의 모든 필드값을 사용할 수 있다.
	void viewBookInfo() {
		System.out.println("제목 : " + title);
		System.out.println("저자 : " + writer);
		System.out.println("출판사 : " + publisher);
		System.out.println("가격 : " + price);
		System.out.println("할인가격 : " + discountPrice);
		System.out.println();
	}
	
}

package day1;

public class BookApp {
	public static void main(String[] args) {
		// 객체 생성하기
		Book book1 = new Book();
		Book book2 = new Book();
		Book book3 = new Book();
		
									// 클래스명@해시코드(객체의 주소값이 아님)
		System.out.println(book1);	// day1.Book@5aaa6d82
		System.out.println(book2);	// day1.Book@73a28541
		
		// 객체의 속성에 값 저장하기
		book1.title = "자바의 정석";
		book1.writer = "남궁성";
		book1.publisher = "도우출판사";
		book1.price = 29000;
		book1.discountPrice = 25600;
		
		book2.title = "이것이 자바다";
		book2.writer = "신용권";
		book2.publisher = "한빛미디어";
		book2.price = 35000;
		book2.discountPrice = 31500;
		System.out.println();
		
		//객체의 기능 사용하기
		System.out.println("### 첫번째 책 정보");
		book1.viewBookInfo();
		System.out.println("### 두번째 책 정보");
		book2.viewBookInfo();
		System.out.println("### 세번째 책 정보");
		book3.viewBookInfo();
	}
}

package day1;

public class BookApp2 {
	public static void main(String[] args) {
		
		//객체 생성
		Book book1 = new Book();
		
		// 객체의 멤버변수 초기화
		book1.title = "이것이 자바다";
		book1.writer = "신용권";
		book1.publisher = "한빛미디어";
		book1.price = 35000;
		book1.discountPrice = 31500;
		
		// 객체의 멤버메소드 호출(실행)
		System.out.println("### 참조변수 book1이 참조하는 Book객체의 정보 출력");
		book1.viewBookInfo();
		
		// book1참조변수가 가지고 있는 주속밧을 book2참조변수에 대입한다.
		// book2참조변수는 book1참조변수와 같은 주소값을 가지게 된다.
		// book2참조변수는 book1참조변수가 참조하는 객체를 같이 참조하게 된다.
		// 즉, 7번째 라인에서 생성된 Book객체를 참조하는 참조변수는 book1과 book2 2개다
		Book book2 = book1;
		System.out.println("### 참조변수 book2이 참조하는 Book객체의 정보 출력");
		book2.viewBookInfo();
		
		// 참조변수가 더이상 객체를 참조하기 못하게 하기
		// 참조변수에 null값을 대입하면 해당 참조변수는 객체의 주소값 대신 null값을 가지게 된다.
		// null값이 저장된 참조변수는 더이상 객체를 참조할 수 없다.
		// book1은 Book객체와의 연결이 끊어졌다.
		// * 참조변수의 주소값이 null인 경우는 객체와의 연결이 끊어졌거나 혹은 아칙 객체가 연결되지 않은 참조변수다.
		book1 = null;
		// book1.title = "스프링 인 액션";	// 객체의 멤버변수에 접근할 수 없다.
		// book1.viewBookInfo();			// 객체의 멤버메소드를 실행할 수 없다.
	}
}

package day1;

public class ProductApp2 {
	public static void main(String[] args) {
		
		// 상품정보를 3개 저장하는 배열객체를 생성하기
		Product[] products = new Product[3];
		System.out.println("### 배열 생성 직후 배열의 각 칸에 저장된 값 출력하기");
		System.out.println("0번쨰 칸 : " + products[0]);
		System.out.println("1번쨰 칸 : " + products[1]);
		System.out.println("2번쨰 칸 : " + products[2]);
		
		// 상품정보를 담을 수 있는 Product객체 3개 생성하기
		Product p1 = new Product();
		p1.no = 100;
		p1.category = "스마트폰";
		p1.name = "아이폰12";
		p1.maker = "애플";
		p1.price = 1500000;
		p1.stock = 20;
		p1.isSoldOut = false;
		
		Product p2 = new Product();
		p2.no = 120;
		p2.category = "노트북";
		p2.name = "LG그램";
		p2.maker = "LG";
		p2.price = 2500000;
		p2.stock = 10;
		p2.isSoldOut = false;
		
		Product p3 = new Product();
		p3.no = 130;
		p3.category = "스마트워치";
		p3.name = "애플워치5";
		p3.maker = "애플";
		p3.price = 600000;
		p3.stock = 30;
		p3.isSoldOut = false;
		
		System.out.println("### 참조변수가 참조하는 객체의 정보 출력하기");
		System.out.println("p1이 참조하는 객체 : " + p1);
		System.out.println("p2이 참조하는 객체 : " + p2);
		System.out.println("p3이 참조하는 객체 : " + p3);
		
		// 배열의 0번째 칸부터 2번째 칸에 생성된 Product객체를 저장하기
		products[0] = p1;			// p1참조변수가 참조하는 객체의 주소값을 배열의 0번쨰 칸에 대입함
		products[1] = p2;			// p2참조변수가 참조하는 객체의 주소값을 배열의 1번쨰 칸에 대입함
		products[2] = p3;			// p3참조변수가 참조하는 객체의 주소값을 배열의 2번쨰 칸에 대입함
		
		System.out.println("### 배열의 각 칸에 Product객체를 저장한 후 각 칸에 저장된 값 출력하기");
		System.out.println("0번째 칸 : " + products[0]);
		System.out.println("1번째 칸 : " + products[1]);
		System.out.println("2번째 칸 : " + products[2]);
		
		
		// 모든 상품의 이름을 화면에 출력하기
		Product px = products[0];	// products배열의 0번째 칸에 저장된 Product객체의 주소값을 px에 대입
		Product py = products[1];	// products배열의 1번째 칸에 저장된 Product객체의 주소값을 py에 대입
		Product pz = products[2];	// products배열의 2번째 칸에 저장된 Product객체의 주소값을 pz에 대입
		System.out.println("### 배열에 각 칸에 저장된 Product객체의 상품이름을 출력하기");
		System.out.println("0번쨰 칸에 저장된 상품객체의 이름 : " + px.name);
		System.out.println("1번쨰 칸에 저장된 상품객체의 이름 : " + py.name);
		System.out.println("2번쨰 칸에 저장된 상품객체의 이름 : " + pz.name);
		
        	System.out.println("0번쨰 칸에 저장된 상품객체의 이름 : " + products[0].name);
		System.out.println("1번쨰 칸에 저장된 상품객체의 이름 : " + products[1].name);
		System.out.println("2번쨰 칸에 저장된 상품객체의 이름 : " + products[2].name);
		
		// 모든 상품의 이름을 향상된 for문을 사용해서 출력하기
		System.out.println("### 향상된 for문을 사용해서 배열에 저장된 모든 상품의 이름을 출력하기 ###");
		for (Product x : products) { // x에는 products배열에 저장된 Product객체의 주소값이 순서대로 출력된다.
			// System.out.println("상품명 : " + x.name);
			String productName = x.name;
			int productPrice = x.price;
			int productStock = x.stock;
			System.out.printf("%-20s%15d%10d\n", productName, productPrice, productStock);
		}
	}
}

0개의 댓글