[객체지향] 국비 22일차

포키·2022년 10월 21일
0

국비과정

목록 보기
21/73

초보자가 객체생성하는 법

  • '눈에 보이는 특징 전부 작성 후, 정 필요 없으면 삭제'

클래스 다이어그램에서 static은 밑줄그어 표시

메소드를 만드는 경우 3가지
1. 중복일 때
2. 너무 길고 복잡할 때
3. 의미 단위로 행위를 분리할 때

선배 조언)

  • 형상관리 연습 : git, svn으로 조별프로젝트하기
  • 블로그 작성
  • 영타 연습
  • ★★★★★ 예제 코드 따라치기 ★★★★★

연산 전 초기값 잊지 말고 넣어주기

코드를 입력하세요

좀 비싼 어딘가? (신시하우스 맞은편?)
신시하우스 - 커피
만배아리랑 - 보쌈정식
합천 돼지국밥 - 순대국밥
청해수산직영점 - 회비빔밥
시장국수와돈가스 - 옛날돈가스
부영숯불구이
대모골
충무낙지
경부 가정식 뷔페


싱글톤 패턴

디자인 패턴의 하나로, '전체 시스템에서 단 하나의 객체만 유지해야 할 때' 사용한다.

class Single {
	private static Single instance = new Single();
    private Single(){}
    
    public static Single getInstance(){
    	return instance;
    }
}
public class SingleTest {
	public static void main(String[] args){
    	Single obj1 = Single.getInstance();
        Single obj2 = Single.getInstance();
        System.out.println(obj1);
        System.out.println(obj2);
    }
}
  • 디자인 패턴
    “바퀴를 다시 발명하지 마라(Don’t reinvent the wheel)”
    전문가들의 노하우를 모아놓은, 프로그래밍하면서 만날 수 있는 상황들에 대한 해답을 담은,
    말하자면 '코드 설계의 문제 해결 패턴 모음'
    참고
  • GoF (Gang of Four) : 디자인 패턴을 집대성한 4명. 그만큼 파급력이 커서 Gang이라고 부름.
  • 지금은 공부해도 시간 낭비😵 5~6년차 되고나서 공부하기.
  • '안티 패턴'이란 것도 존재함 (반면교사 모음)
  • 공유되는 객체들의 조건
    state-less : 멤버변수=유지되는 값x 메서드만 존재

객체지향의 특징 (p.138)

추상화

= '이름 붙이기'
다양한 정보가 들어간 '코끼리(실체)'를 우리는 '코끼리(단어)'로 부르기로 했다.
추상화란 다양한 정보, 특징을 단순한 무언가에 담아 사용하는 것이다.

Car c;

Car c에서 c는 Car 객체의 주소를 가진다.
다시 말하면 우리는 다양한 값과 기능을 지닌 Car 객체를 'c'라는 이름 하나로 부르기로 한 것이다.

캡슐화

= '비가시화'로 외부로부터의 보호
① 보호 ② 묶음
외부에서 눈으로 확인할 수 X -> 외부에서 내부요소 인지X -> '조작 by 외부인' 원천 차단

상속, 다형성

나중에 함


예제풀이 (p.220~)

1. BankAccount 객체간 송금 기능을 구현하라

/*
	BankAccount
	-----------
	-balance : int
	-----------
	+BankAccount(balance : int)
	+transfer(amount : int, b : BankAccount) : void
	+getBalance() : int
	+setBalance(int balance) : void
	+toString() : String
*/

class BankAccount {
	// 잔액 멤버변수
	private int balance;
	
	// BankAccount 생성자
	public BankAccount(int balance){
		setBalance(balance);
	}
	
	// getter, setter
	public void setBalance(int balance){
		this.balance = balance;
	}
	public int getBalance(){
		return balance;
	}

	// transfer : 돈 받을 계좌 = ★Bankaccount객체 주소★와 금액 = amount 를 받아서 인출-입금을 진행하는 메서드
	// 필요한 정보(=parameter)는 내 계좌 주소, 상대 계좌 주소, 보내려는 금액인데, 내 계좌에서 진행하니까 내 계좌 주소는 필요가 x!
	public void transfer(int amount, BankAccount a){
		if(amount > 0){
			if(amount <= balance){
				setBalance(balance - amount);
				a.setBalance(a.getBalance() + amount);
				System.out.println("transfer(" + amount + ") 호출 후\n");
			} else {
				System.out.println("계좌의 잔액이 부족합니다.");
			}
		} else {
			System.out.println("인출액은 양수여야 합니다.");
		}
	}
	// toString - 계좌 잔액 표시
	public String toString(){
		return "BankAccount [balance=" + balance + "]";
	}
}
class Page220_1 {
	public static void main(String[] args) {
		BankAccount a1 = new BankAccount(10000);
		BankAccount a2 = new BankAccount(0);

		System.out.println("a1: " + a1);
		System.out.println("a2: " + a2 + "\n");
		a1.transfer(1000, a2);
		System.out.println("a1: " + a1);
		System.out.println("a2: " + a2);
	}
}

2. Circle 객체 이동 메서드 (static 메서드 'move' 사용)

/*
	Circle
	----------
	x : int
	y : int
	radius : int
	----------
	Circle(x : int, y : int, radius : int)
	static move(temp : Circle, dx : int, dy : int) : void
*/
class Circle {
	// 좌표 (x, y)와 반지름 멤버변수
	private int x;
	private int y;
	private int radius;
	
	// 생성자
	public Circle(int x, int y, int radius){
		setX(x);
		setY(y);
		setRadius(radius);
	}
	
	// getter, setter 메서드
	public int getX(){
		return x;
	}
	public int getY(){
		return y;
	}
	public int getRadius(){
		return radius;
	}
    public void setX(int x){
		this.x = x;
	}
	public void setY(int y){
		this.y = y;
	}
	public void setRadius(int radius){
		this.radius = radius;
	}

	// toString (객체 정보를 String으로 반환하는 메서드)
	public String toString() {
		return String.format("Circle [x=%d, y=%d, radius=%d]", x, y, radius);
	}

	// 이동 메서드 (parameter = 움직이려는 Circle 객체, x축(가로) 이동치, y축(세로) 이동치)
	public static void move(Circle temp, int dx, int dy){
		temp.setX(temp.getX() + dx);
		temp.setY(temp.getY() + dy);
	}
}
public class Page220_2 {
	public static void main(String[] args) {
		Circle c = new Circle(10, 10, 5);
		System.out.println(c + "\n");
		Circle.move(c, 10, 20);
		System.out.println("move() 호출 후");
		System.out.println(c);
	}
}
  • String.format 메서드 - printf와 유사하게 작동함
public String toString() {
	return String.format("Circle [x=%d, y=%d, radius=%d]", x, y, radius);
}

3. Car 객체와 static변수 numberOfCars(자동차총생산수)

/*
	Car
	----------
	-model : String
	-make : String
	-static numberOfCars : int
	----------
	+Car(model : String, make : String)
	+Car(model : String)
	+getNumberOfCars() : int
*/

class Car{
	// 모델 이름, 생산자 멤버변수
	private String model;
	private String make;
	// 생산된 자동차 총 대수 static변수
	private static int numberOfCars;

	// 모델 이름과 생산자를 요구하는 생성자
	public Car(String model, String make){
		this(model);
		setMake(make);
	}
	// 모델 이름을 요구하는 생성자
	public Car(String model){
		setModel(model);
		Car.numberOfCars++;
		printNumberOfCars();
	}
	// getter, setter 메서드
	public String getModel(){
		return model;
	}
	public String getMake(){
		return make;
	}
	public void setModel(String model){
		this.model = model;
	}
	public void setMake(String make){
		this.make = make;
	}
	public String toString(){
		return model + "(" + make + ")"
	}
	private static void printNumberOfCars(){
		System.out.println(String.format("자동차 1대 생산, 누적 생산량=%d대\n",Car.numberOfCars));
	}
	// '생산된 자동차 총 대수 static변수'를 가져오는 static getter 메서드
	public static int getNumberOfCars(){
		return Car.numberOfCars;
	}
}
class Page221_4 {
	public static void main(String[] args) {
		Car c1 = new Car("아우디 S6");
		Car c2 = new Car("모닝","기아");
		Car c3 = new Car("롤스로이스");
	}
}
profile
welcome

0개의 댓글