05. 메서드 재정의와 가상 메서드 원리


이론 정리

메서드의 호출 과정은?


  • 메서드 이름은 주소값이다.
    • 메서드의 이름 자체가 주소이다.
  • 프로그램 작동시 메모리 공간 : 메서드영역(코드영역 :스테텍:상수영역)에 메서드 명으로 탑제
    • 메서드 명 중복(오버 로딩)상황 에서는 메서드명 뒤로 더미 데이터를 붙여 개별화
  • 프로그램 작동후 메서드 호출시 코드영역에서 메서드 명으로 검색. 호출
    • 메서드 의 지역변수들은 스택 메모리에 탑제
  • 다른 인스턴스라도 같은 객체 기반의 메서드는 같은 코드영역의 주소에서 호출
    • 인스턴스 생성시 변수들은 힙 메모리에 따로 생성
    • 메서드는 작동시 한번만 메모리에 탑제(로드)
    • 인스턴스 별로 메서드가 따로 생성되지 않는다.

test

package method;

public class test {
	int num;
	
	void aaa() {
		System.out.println("aaa() 호출");
	}
	
	public static void main(String[] args) {
		
		test a1 = new test();
		a1.aaa();
		
		test a2 = new test();
		a2.aaa();
	}

}

test코드 살펴보기


메모리영역에서 생기는 일

  • 힙(유동 메모리) : a1의 int num와 a2의 int num이 탑제 된다.
  • 스택 메모리(main함수의 지역변수) : a1, a2, args 탑제.
  • 메서드영역(상수,static,코드영역) : aaa() 메서드 탑제.
  • 메모리영역에서 발생되는 사건의 순서
    1. 스택 메모리에 main함수의 지역변수 공간에 변수들이 탑제.
      1. a1, a2, args
    2. 힙 메모리에 a1 , a2의 실제 인스턴스와, 멤버변수 a1의 num a2의 num이 탑제된다.
    3. 메서드 영역에 aaa()영역이 생성 된다.
    4. aaa() 메서드 내부의 변수들이 스택 메모리 영역에 탑제 된다.
  • //두가지 인스턴스에서도 aaa() 메소드는 단일한 메소드가 호출 된다.

가상 메서드의 원리


  • C나 C++에서는 virtual fucntion(가상함수) 이라고 부른다.
  • 가상 메서드란 메서드의 이름 자체가 메모리의 코드 영역에서 주소값이 되는것이 아니라 JVM에서 관리되는 어드레스 테이블(VMT : virtual method table)에서 메서드에 매치(바인딩 : 맵핑 )되는 메모리 주소값을 기반으로 작동 되는것이다.
  • 각 클레스마다 가상 메서드 테이블을 갖고 있다.
    • 클레스의 상속 관계에서 오버 라이드 된 메서드는 별개의 메서드로 동작한다. (개층별 클레스마다 가상 메서드 테이블이 따로 존제하는데 제정의되지 않은 메소드는 주소값을 공유한다)
  • 자바는 모든 메서드가 가상 메서드 이다. 다른 언어에서는 함수의 이름 자체가 주소 이다.

복습 & 실무적인 사용방법

 


06. 다형성과 다형성을 사용하는 이유


이론 정리

다형성(polymorphism : 폴리모리시즘) 이란?

  • 하나의 코드가 다양한 데이터형(자료형)으로 구현되어 실행되는것.
    • 하나의 코드에서 다른 결과가 나오는것
  • 정보은닉. 상속과 더불어 객체 지향 의 가장 큰 특징이다.
  • 잘 활용하면 유연하고 . 확장성이 있고. 유지보수가 편리하게 개발할수 있다.
  • 이해하기 쉽지 않다.?!
  • 이해하면 넘모 좋은 기능이라고 하니 강의를 반복 시청하면서. 다른 정리된 블로그들도 참고해 보겠습니다.

TEST CODE

package polymorphism;
class Animal{
	public void move() {
		System.out.println("동물이 움직입니다.");
	}
}
class Humam extends Animal{
	@Override
	public void move() {
		System.out.println("사람이 움직입니다.");
	}
	
	public void readBook() {
		System.out.println("사람이 책을 읽습니다.");
	}
}

class tiger extends Animal{
	@Override
	public void move() {
		System.out.println("사자가 움직입니다.");
	}
	
	public void hunting() {
		System.out.println("사자가 사냥을 합니다.");
	}
}

class Eagle extends Animal{
	public void move() {
		System.out.println("독수리가 하늘을 날아 다닙니다.");
	}
	
	public void flying() {
		System.out.println("독수리가 양날개를 쭉 펴고 날아 다닙니다.");
	}
}
public class AnimalTest {
	public static void main(String[] args) {
		Animal hAnimal = new Humam();
		Animal tAnimal = new tiger();
		Animal eAnimal = new Eagle();
		AnimalTest test = new AnimalTest();
		test.moveAnimal(hAnimal);
		test.moveAnimal(tAnimal);
		test.moveAnimal(eAnimal);
	}
	public void moveAnimal(Animal animal) {
		animal.move();
	}
}

<스스로 과제> : 다형성 (polymorphism) 과제 시나리오 작성

순서 :

  1. 많은 객체에 상속 할수 있는 슈퍼(super) : 부모 객체를 만든다.!
  2. 자식 객체(child)들과 자식들이 하는 것을 만든다.
  3. 부모 객체로 인스턴스들을 만드는데 생성자가 자식 들이다. !
  4. 부모 타입을 매개변수로 받아서 행동하게 만드는 메소드를 만든다.
  5. 부모 객체 이지만 . 자식의 행동을 할수 있다는것이 증명 된다.

Human : 부모 객체

package polymorphism_2;

public class Human {
	public void talk() {
		System.out.println("탄수화물을 단식하자");
	}
}

child

package polymorphism_2;

public class child extends Human{
	public void talk() {
		System.out.println("이몸도 요즘 어린이들의 비만이 문제라는데 다이어트 할래");
	}
}

doctor

package polymorphism_2;

public class doctor extends Human {
	public void talk() {
		System.out.println("당신에게는 다이어트가 필요합니다");
	}
}

Programmer

package polymorphism_2;

public class Programmer extends Human {
	public void talk() {
		System.out.println("사장님 저 집에 언제 가요? ");
	}
}

TEST_1

package polymorphism_2;

public class TEST_1 {
	public static void main(String[] args) {
		Human cHuman = new child();
		Human dHuman = new doctor();
		Human pHuman = new Programmer();
		
		TEST_1 T = new TEST_1();
		T.mainTalk(cHuman);
		T.mainTalk(dHuman);
		T.mainTalk(pHuman);
	}
	public void mainTalk(Human human) {
		human.talk();
	}
}

복습 & 실무적인 사용방법

 


전문 용어


에러 메세지


학습 시간


캠 스터디

 


공부 모임

1) 카카오톡 오픈 채팅방

  - 모르는것 질문하기

  - 이해가 가지 않는 부분을 다른 분들이 블로그에서 정리한 글을 살펴보고 참고 하기

2) 구루미 온라인 독서실

  - 학습 시간 관리하기

  - 남들과 경쟁하기 


온라인 강의 주소

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다

 


03. 상속에서 클래스 생성 과정과 형 변환

이론적인것과 더불어 실무에서 사용하는것에 대한 관심도 동시에 진행


강의 내용 정리

상속은 어떻게 상위 객체의 자원을 사용 할까요?

  • 상속 받은 클레스를 생성하면 상하는 클래스의 자원이 먼저 생성 됩니다.  
  • 상위 클레스의 생성자가 먼저 진행 된후. 하위 클래스가 진행 됩니다.
  • 상위 클레스의 생성자에 매게변수가 없다면 상속받는 클레스에서 자동으로 상위 클레스의 자원들이 만들어 지지만. 상위 클레스의 생성자에 매게변수가 있다면 상속받은 클레스 에서도 super을 사용해서 상위 클레스의 생성자에 매게변수를 입력해줘야 진행 됩니다.

super 란?

  • 상속받는 하위 클레스의 생성자 내에서 사용할수 있어요.
  • super()괄호 사이에 매게변수를 입력하면 상속하는(상위) 클레스의 자원이 생기는 과정에서. 상위 클레스의 생성자()괄호 사이에 매게변수를 입력하는것 처럼 작동 됩니다.
  • 모든 하위 클레스에서 생성자나 super를 입력하지 않았을 경우 컴파일 과정에서 자동으로 내부가 비어있는 생성자와 super가 하위 클레스에 만들어 집니다.
    • 상위 클레스의 생성자에 매게변수가 있으면 명시적으로 super을 하위 클레스에 만들어야 한다.
  • 생성하지 않으면 상속 받는 객체에서는 컴파일러가 비어있는 super()를 생성합니다.
    • 안드로이드 개발에서는 자주 명시적으로 super로 매게변수를 입력해줘야 작동하는 클레스나 메서드가 등장하게 되는데 (프레임 워크 이기 떄문에 빈칸 체우기를 잘해야 합니다 ^^;;.) 메서드의 정보를 자주 검색하게 되는데 찾게된 정보가 영어라서 곤란하게 된 여러분의 미래가 보입니다.~ (갑자기 분위기 점보는집 )
  • 하위 클레스에서 super문법을 사용하면 . super가 상위 클레스의 생성자 메소드를 대신합니다. (상위 클레스의 기본 맴버변수를 생성자로 만들게 하는 상황에서, 상위 계층이 먼저 만들어져서 필요합니다)
    • 이전 챕터의 customer클레스(생성자 customer(customerName){})를 상속 받은 하위 계층 클레스 내부에서 super()는 customer의 생성자를 super(customerName){}으로 항상 먼저 생성되는 상위 클래스의 생성자를 제어한다.
  • 힙 메모리에서 상위 클레스 다음 하위 클레스가 생성된다.

<스스로 과제>

A는 StringA가 있는 객체이다. B는 A를 상속받고 intA가 있는 객체이다.

각자의 내부의 정보를 매게변수로 받아서 출력하는 메소드 만들어보자.

A

package extends_2;

public class A {
String StringA = "A정보 입니다";

public A(String StringA) {
	this.StringA = StringA;
}
public void showAinfo() {
	System.out.println(StringA);
}
}

B

package extends_2;

public class B extends A {
	int intA= 10;
	public B(String A) {
		super(A);
	}
	public void showBInfo() {
		System.out.println(intA +" : "+ StringA);
	}
}

TEST

package extends_2;

public class TEST {
	public static void main(String[] args) {
		A TESTA = new A("TEST");
		TESTA.showAinfo();
		B TESTB = new B("TESTB");
		TESTB.showBInfo();
	}
	
}

형변환(업 캐스팅) 이란?

  • 캐스팅이란 자료형(데이터 타입)을 변환하는 것을 말하며 형변환이라고도 한다.
  • 상위 클래스로 변수를 선언하고 하위 클래스의 생성자로 인스턴스를 생성한다.
    • Custoler custoerLee = new VIPCustoer();
  • 상위 클래스 타입의 변수에 하위 클래스 변수가 대입된다.
    • VIPCustomer vCustoer = new VIPCustomer(); addCustoer(vCustomer);
    • int addCustoer(Custoer custoer){
    • }
  • 하위 클레스는 상위 클래스의 타입을 내포하고 있으므로 상위 클래스로의 목시적 형변환이 가능하다.
  • 상속 관계에서 모든 하위 클래스는 상위 클래스로 형 변환(업케스팅)이 돤다.

<스스로 과제 : 상위 클레스 A 타입으로 B생성자로 만들면 B의 요소를 사용할수 있는지 확인해보자 >

A

package extends_3;

public class A {
String StringA ;
public A(String StringA) {
	this.StringA = StringA;
}
}

B

package extends_3;

public class B extends A {
	int intB ;
	public B() {
		super("B");
		intB = 10;
	}
}

TEST (업스케일링 예시)

**package extends_3;

public class TEST {
	public static void main(String[] args) {
		A TEST = new B(); // B타입으로 만들어서 A타입에 넣다(변환).
		System.out.println(TEST.StringA);
//		System.out.println(TEST.intB); // 컴파일 타입 에려 
		//상위A 클레스로 형변환(업스케일링)은 할수 있지만. 하위 클레스의 요소(intB)는 갖고 있지 않기 때문에. 접근할수 없다. 
//	TEST.intB = 10; // 컴파일 타입에러 : 마찬가지 경우
//B의 생성자 매게변수로 값을 넣으면 자동으로 A에 없는건 사용할수 없게 만들어 진다.
//다시 B의 요소에 접근하기 위해서는 다운 스케일링을 하면 접근할수 있다. 
	}
}**

강의 내용 체크 ( 복습 )

 


04. 메서드 재정의 하기(overriding)


강의 내용 정리

 

메서드 재정의(overriding: 오버라이딩) 란?

하위 클레스에서 상위 클레스의 메서드를 그대로 사용하지 않고 덮어쓰기하듯이 같은 메서드를 만들어주면 상위 클레스의 메서드를 작동 시키지 않고 하위 클레스 에서 대체해서 사용할수 있게 되어있다.

(강의 문서의 overring은 오타 이다.)

  • 메서드 이름, 매게변수 데이터 타입, 매게변수 이름 등을 오버로딩 되지 않게 동일한 것으로 생성해야 한다. ( 이런 동일 요소를 메서드 시그니쳐 라고 한다)

<스스로 과제 내기>

B가 A클래스를 상속하고 있는 상황에서.

A의 changeIntA메서드는 매개변수로 intA를 받지만

“A의 메서드입니다”라는 글자만 콘솔에 출력한다.

B의 changeIntA메서드는 매개변수로 intA를 받고

intA를 매개변수 intA로 변경한다.

B.changeIntA 메서드를 작동 시켰을때

A의 메서드 입니다. 가 출력되는지. intA의 값이 변경되는지 관찰해 보자.

A

package overriding_1;

public class A {
	int intA ;
	public A() {
	}
	
	public void changeIntA(int intA) {
		System.out.println("A클레스의 메서드가 작동되었습니다");
	}
}

B

package overriding_1;

public class B extends A {
	public B() {
	}
	public void changeIntA(int intA) {
		this.intA = intA;
	}
}

TEST

package overriding_1;

public class TEST {
	public static void main(String[] args) {
		B TESTB  = new B();
		TESTB.changeIntA(30);
		System.out.println(TESTB.intA);
	}
}

에노테이션 이란?

  • 애노테이션이란 주석이라는 의미이다
  • 컴파일러에게 특정한 정보를 전달하는 역할을 한다.

애노테이션 설명

@Override 재정의된 메서드라는 정보를 컴파일러에 제공한다.
@Fuctionallnterface 함수형 인터페이스라는 정보를 제공한다.
@Deprecated 이후 버전에서는 사용되지 않을수 있는 변수. 메서드에 사용된다.
@SuppressWarnings 특정 경고가 나타나지 않도록 함
(예) @SupperessWarnings(”deprecation”)는 @Deprecated가 나타나지 않도록 한다.  

@overriding 애노테이션은 재정의 된 메서드라는 의미를 전달하는데

메서드가 기존의 메서드와 다를 경우에는 에러가 발생하게 된다.

<스스로 과제 내기>

기존의 메서드와 다를경우 출력되는 에러 확인하기.

@Override 사용후 기존의 메서드와 매게변수가 다를경우

@Override미사용시

(에러가 발생하지 않는다)

강의 내용정리

double(소수점)값의 계산후 소수점을 없일때 (int)로 케스팅(형변환됩니다)

double doubleA = 4.2323;
	int intA = (int)doubleA;
	System.out.println(intA);

<강의 내용대로 과제 코딩 >

Customer

package Customer;

public class Customer {
	protected int customerID;
	protected String customerName;
	protected String customerGrade;
	protected int bonusPoint;
	protected double bonusRatio;
	protected double salesRatio;

	//getter, setter 구현
	public Customer(int customerID, String customerName) {
		this.customerID = customerID;
		this.customerName = customerName;
		
		customerGrade = "SILVER";
		bonusRatio = 0.01;
		System.out.println("Customer(int, String) 생성자 호출");}

	public int calcPrice(int price) {
		
		return price;
	}
	public int getCustomerID() {
		return customerID;
	}

	public void setCustomerID(int customerID) {
		this.customerID = customerID;
	}

	public String getCustomerName() {
		return customerName;
	}

	public void setCustomerName(String customerName) {
		this.customerName = customerName;
	}

	public String getCustomerGrade() {
		return customerGrade;
	}

	public void setCustomerGrade(String customerGrade) {
		this.customerGrade = customerGrade;
	}
	
	public String showCustomerInfo() {
		return customerID+":"+customerName+":"+customerGrade+":"+bonusPoint+":"+bonusRatio;
	}

}

CustomerTest

package Customer;

public class CustomerTest {
	public static void main(String[] args) {
		Customer customerLee = new Customer(10010, "이순신");
		customerLee.bonusPoint = 1000;
		System.out.println(customerLee.showCustomerInfo());
		
		VIPCustomer customerKim = new VIPCustomer(10020, "김유신");
		customerKim.bonusPoint = 10000;
		System.out.println(customerKim.showCustomerInfo());
		
		int priceLee = customerLee.calcPrice(10000);
		int priceKim = customerKim.calcPrice(10000);
		
		System.out.println(customerLee.showCustomerInfo() + " 지불금액은 " + priceLee + "원 입니다.");
		System.out.println(customerKim.showCustomerInfo() + " 지불금액은 " + priceKim + "원 입니다.");
		
		Customer customerNo = new VIPCustomer(10030, "나몰라");
		customerNo.bonusPoint = 10000;
		int priceNo = customerNo.calcPrice(10000);
		System.out.println(customerNo.showCustomerInfo() + " 지불금액은 " + priceNo  + "원 입니다.");

	}
}

VIPCustomer

package Customer;

public class VIPCustomer extends Customer {
	private int agentID;
	
	public VIPCustomer(int customerID, String customerName) {
		super(customerID, customerName);
		
		customerGrade = "VIP";
		bonusRatio = 0.05;
		salesRatio = 0.1;
		
		System.out.println("VIPCustomer(int, String) 생성자 호출");
}
	@Override
	public int calcPrice(int price) {
		bonusPoint += price * bonusRatio;
		return price - (int)(price * salesRatio);
	}

	
	public int getAgentID() {
		return agentID;
	}

}

강의 내용 체크 ( 복습 )

< 스스로 과제 >

상위 계층의 인스턴스를 하위 생성자로 생성 했을때.

상위 변수와 , 메소드만 접근할수 있다?

그렇다면 하위 생성자는 작동 될것인가?

A = 생성자 : intA=10

package restudy;

public class A {
	int intA ;
	A(){
		this.intA = 10;  
	}
}

B = 생성자 : intA = 20

package restudy;

public class B extends A {
	int intB ;
B(){
	this.intA = 20;
}
}

TEST

package restudy;

public class TEST {
public static void main(String[] args) {
	A TESTB = new B();
	System.out.println(TESTB.intA);
	
}
}

출력

20

 

가장 메서드란?

상위 계층 타입 인스턴스를 하위 계층 의 생성자로 생성했을때.(업스케일링시)

상위 , 하위 게층에 둘다 존제하는 메서드를 호출하면 하위 게층의 메서드가 호출되는것.

<스스로 과제> : 직접 확인

A : print 메서드가 “A내용 입니다” 출력

package restudy;

public class A {
	int intA ;
	A(){
		this.intA = 10;  
	}
	void print() {
		System.out.println("A의 메서드 입니다");
	}
}

B : print 메서드가 “B내용 입니다” 출력

package restudy;

public class B extends A {
	int intB ;
B(){
	this.intA = 20;
}
void print() {
	System.out.println("B의 메서드 입니다");
}
}

TEST : A타입으로 B생성자로 생성된 인스턴스.(업스케일링)의 경우 인스턴스의 메서드는 B의 것이 오버라이딩 되는가.?

package restudy;

public class TEST {
public static void main(String[] args) {
	A TESTB = new B();
	TESTB.print();
	
}
}

결론: YES 상위 타입의 인스턴스 이지만 하위 객체의 메서드가 출력된다.

B의 메서드 입니다

개발 영어 어휘


에러 메세지의 이해


학습 타이머


 

캠 스터디


스터디 그룹

1) 카카오톡 오픈 채팅방

  - 모르는것 질문하기

  - 이해가 가지 않는 부분을 다른 분들이 블로그에서 정리한 글을 살펴보고 참고 하기

2) 구루미 온라인 독서실

  - 학습 시간 관리하기

  - 남들과 경쟁하기 

 

온라인 강의 주소

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

 


01. 객체 간의 상속은 어떤 의미일까


강의 내용 정리

상속이란?

새로운 클래스를 정의 할 때 이미 구현되어 있는 클레스의 메소드나 변수를 사용할수 있습니다.

  • 이미 구현된 클래스 보다 더 구체적인 기능을 가진 클래스를 구현해야 할때 기존 클래스를 상속한다.
  • 한글 어휘 :
    • 상위 클래스(A) ←A클래스가 B클래스에게 상속한다 — 하위 클래스(B) [상위 클래스: 한다]
    • 상위 클래스(A) →B클래스가 A클래스를 상속받는다. → 하위 클래스(B) [하위 클래스: 받는다]
  • 영어 어휘 :
    • 상속하는 클래스 (상위 클래스)
      • parent class
      • base class (C++)
      • super class
    • 상속받는 클래스 (하위 클래스)
      • child class
      • derived class
      • subclass

상속 하는법

B.java파일에서 class B{} 대신

class B(하위 클래스 : 나 자신 ) extends A(상위 클래스){

}

을 사용한다.

  • 예시 ) 사람(human) 클래스와 포유류(Mammal)의 클래스 :
    • class human extends Mammal{
    • }
  • 뜻 : 포유류의 개념을 전부 가지고 있는 사람이라는 클레스가 필요해서 만든다.
    • 사용하려는 클래스 : human | 다시 만들지 않아도 되는 변수 : Mammal의 맴버 변수
    • 주의 : private는 외부 클레스에서는 참조할수 없기 때문에 protectd(상속관계에서만 참조가능)을 사용한다.
  • extends 키워드 뒤에는 단 하나의 클래스만 올수 있다. 자바는 단일 상속(single ingeritance)만을 지원하기 때문이다.

상속을 하게 되는 상황

  • 상위 클래스가 하위 클래스 보다 더 일반적인 개념과 기능을 갖을때
  • 하위 클래스가 상위 클래스 보다 더 구체적인 개념과 기능을 갖을때
    • 하위 클래스가 더 단순하고 명확하고 상위 클래스가 더 확장적인 의미를 갖고 있을때

강의 내용 체크 ( 복습 )

상속은 코드 재사용보다 확장한다라는 뜻으로 사용해야 설계에 적합하다.

조금더 구체적이고 기능이 더 많이 포함 되어 있는 하위클레스와 상위클레스는 오버되는 기능을 갖고 있으면 않된다.

자바에서는 하나의 클레스는 하나의 클레스만 상속할수 있다.

C++에서는 다중 상송이 가능하다.

많은 상속이 가능할수록 기능이 많이질수 있지만 .계층 관계가 모호해지게 된다.

다른 클레스에 사용하고싶은 기능이 있어서 그 클레스를 상속받아서는 않된다.

  • 하나의 부모는 여러 자식 을 가질수 있습니다.
  • 자식은 여러 부모를 가질수 없습니다.
  • 자식은 자신의 자식을 가질수 있습니다.
  • 자식만 부모의 소스를 전부 사용할수 있습니다.
  • 물려받은 자원을 override하여 수정하여 사용할수도 있습니다.
  • 부모는 자식의 소스를 사용할수 없습니다.
  • 자식은 부모의 부모의 부모의 자원도 사용할수 있습니다.

 


02. 상속을 활용한 멤버십 클래스 구현하기


강의 내용 정리

예제코드 구현 챕터

과제)

회사에서 고객 정보를 활용한 맞춤 서비스를 하기 위해 일반고객(Customer)과
이보다 충성도가 높은 우수고객(VIPCustomer)에 따른 서비스를 제공하고자 함

물품을 구매 할때 적용되는 할인율과 적립되는 보너스 포인트의 비율이 다름
여러 멤버십에 대한 각각 다양한 서비스를 제공할 수 있음
멤버십에 대한 구현을 클래스 상속을 활용하여 구현해보기

<스스로 구현>

  1. 일반고객 or VIP고객 > 구입 > 상품명
    • Customer
      • 구입 (메서드 혹은 객체)
        • 상품명 ( ArrayList )
    • VIPCustomer
      • 구입 (메서드 혹은 객체)
        • 상품명 ( ArrayList )
  2. 구입 > 일반고객 or VIP고객 > 상품명
    • 구입 (main)
      • VIP고객 ( 메서드 오버 로드로 분기작동 )
        • 상품명 ( ArrayList : singletone )
      • 일반고객 ( 메서드 오버 로드로 분기작동 )
        • 상품명 ( ArrayList : singletone )
  3. 변수의 설정
    1. 상품명 : 단일(singletone), 공용(static), 메모리에 상주, 이미 정해져 있는 값이다.
      1. ArrayList속성 GoodsName, GoodsPrice
    2. 고객 구분 : 애매한 부분으로 . vip 일반 고객의 객체로 고객을 생성하도록 코드 설계.
    3. 구입 : 구입만을 위한 코드이기 때문에 상위계층이 없지만 . 가상의 시스템에서 사용하는것을 전제로 코드설계.
  4. 스스로 코드를 구현해본 결과 상속을 사용하지 못하고 코딩 하게 된다.( 언제 사용하는지 모른다 : 강의코드를 보고 언제 상속을 사용하는지 상황을 정리해야 할것 같다. )

<강좌 정리>

상속을 사용하는 상황.

이미 만들어진 코드에 새로운 기능을 추가적으로 만들어야 하는 상황.

  • 예를들어 고객만 있고 VIP 고객은 없다는 가정하에 코딩이 되어있는 경우에. VIP고객의 기능 추가에 필요한 정보를 고객에게서 상속받아 기능을 추가하는 것이다.
    • 현업에서 기능추가 상황이 발생하는 것은 흔하다는데. 어쩌면 단골 기능일지도!@_@?
  • 그밖에 if문으로 greade값의 문자를 비교해서 작동되게 하는방법은 차후에 기능이 점점 늘어나게 되면. if문으로 만든 코드는 전체 코드의 규모가 커지면서 매우 유지보수측면에서 복잡해져서 불리하다.
  • TF팀 처럼 특정 목적을 위해서 분리 운영 하고 해체 하는것을 떠올리면 될것 같다.

사용하는 방법.

상속받는 입장에서 private 변수의 값을 변경해야 하는 경우 . 외부 클레스에서 접근이 불가능하기 때문에 접근할수 없다. 상곡관계객체에서만 접근할수 있는 protectd로 변수를 변경해주면 은닉성을 유지할수 있다.

  • 고객 : Customer
    • 이름, 보너스포인트
  • VIP고객 : (고객 객체를 상속받는다)
    • 이름, 보너스포인트
    • 상담원 리스트 ArrayList : 에서 상담원을 배정 받는다.
      • 상담원 번호 , 이름
  • 상품 리스트 : private static itemList ArrayList (single tone 복습)
    • 가격,이름

Test

package Customer;

public class Test {
public static void main(String[] args) {
	Customer customerA = new Customer("A", 10000);
	customerA.calcPrice(1000);
	System.out.println(customerA.showCustomerInfo());
	VIPCustomer customerB = new VIPCustomer();
	customerB.setCustomerName("B");
	customerB.setCustomerBonusPoint(10000);
	customerB.calcPrice(1000);
	System.out.println(customerB.showCustomerInfo());
}
}

Customer

package Customer;

public class Customer {
	private String customerName;
	private int customerBonusPoint ;
	protected String customerGrade ;
	protected double bonusRatio ;
	public Customer(String customerName , int customerBonusPoint) {
		this.customerName = customerName;
		this.customerBonusPoint = customerBonusPoint;
		this.bonusRatio = 0.01;
	}
	public Customer() {};
	public int calcPrice(int price) {
		this.customerBonusPoint += price*bonusRatio;
		return price;
	}
	public String showCustomerInfo() {
		return "고객명 : "+customerName+", 포인트:"+customerBonusPoint+", 고객등급:"+customerGrade+", 포인트률 : "+bonusRatio;
	}
	public String getCustomerName() {
		return customerName;
	}
	public void setCustomerName(String customerName) {
		this.customerName = customerName;
	}
	public int getCustomerBonusPoint() {
		return customerBonusPoint;
	}
	public void setCustomerBonusPoint(int customerBonusPoint) {
		this.customerBonusPoint = customerBonusPoint;
	}
	public String getCustomerGrade() {
		return customerGrade;
	}
	public void setCustomerGrade(String customerGrade) {
		this.customerGrade = customerGrade;
	}
	public double getBonusRatio() {
		return bonusRatio;
	}
	public void setBonusRatio(double bonusRatio) {
		this.bonusRatio = bonusRatio;
	}
	
}

VIPCustomer

package Customer;

public class VIPCustomer extends Customer {
		double saleRatio ;
		private int agentID ;
		
	public VIPCustomer() {
	
		customerGrade= "VIP";
		bonusRatio = 0.1;
		saleRatio = 0.1;
	}
	

}

상속을 사용하지 않았을 경우. (개인적인 생각)

코드는 유지 보수 되면서 점점 커진다는점을 고려해 본다면 ,상속을 사용하지 않았을 경우

  1. 점차 복잡해진다.
    1. 예시) 본 코드에서 처음에 고객만 존제했는데 차후에 VIP고객이 생겼다고 했을경우 VIP고객인가 라는 IF문을 위해 grade등급을 고객 객체에 직접 부여 해야 한다. 기존 고객들의 데이터에 접근해서 일반 고객과 Vip고객의 구분을 위한 정보를 추가 해야 한다. 물론 데이터의 파편화를 막아서 통합을 위해 상속을 사용하지 않을려는 방향성도 있을수 있지만. 계속if문으로 기존의 데이터에 접근하고. 다시 IF문을 추가해서 기존의 데이터에 접근하다보면 코드의 수정에 복잡함을 가져올수 있다. 하지만 상속을 사용했을 경우에는 기능 추가가 간단하며. 기존의 고객의 정보를 전부 수정하지 않아도 괜찮다. 하지만. 상속 구조가 복잡해지면 의미가 없어질것 같은데
    2. 일반 고객 객체 에도 VIP고객의 기능이나 구분을 위한 변수가 추가 되기 때문에 고객 객체의 의미가 불분명해진다.

강의 내용 체크 ( 복습 )


개발 영어 어휘


에러 메세지의 이해


학습 타이머


 

캠 스터디

 


스터디 그룹

1) 카카오톡 오픈 채팅방

  - 모르는것 질문하기

  - 이해가 가지 않는 부분을 다른 분들이 블로그에서 정리한 글을 살펴보고 참고 하기

2) 구루미 온라인 독서실

  - 학습 시간 관리하기

  - 남들과 경쟁하기 

 

온라인 강의 주소

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

 

 


21. 객체 배열 사용하기


강의 내용 정리

객체배열이란 ?

  • 클레스를 자료형(데이터타입)하여 배열과 같이 순서 기반의 모을수 있는 장소를 만드는 것
  • 클레스의 베열, 인스턴스의 베열로 정리해도 무리 없을듯.
  • 기본자료형(int,char,boolean) 배열은 선언과 동시에 배열의 크기만큼의 메모리 가 할당 된다.
    • 객체 배열의 경우에는 요소가 되는 객체의 주소가 들어갈 (4byte,8byte)메모리 만 할당되고 생성된 인스턴스의 레퍼런스 벨류(참조주소에 들어있는 값)에는 클레스의 맴버변수가 들어있는 메모리가 할당 되어 있지 않고 (null)이 들어가기 때문에 객체 배열을 생성한 후 각 참조 주소에 생성자(new)를 사용해서 객체를 입력해야 한다. (말이 어려워 졌다)
      • 즉 쉽게 말하자면 객체배열 과 객체 배열의 인덱스 마다 들어있는 인스턴스는 따로 선언해야 한다.
      • 더 단순하게 생각하면 기본값이란 String(객체니까)를 제외하고는 다른 자료형의 경우 0이나 false, 55(char)가 선언하면 자동으로 들어가 있는데 반해서 객체는 null(String,배열 타입도)가 들어있어서 메모리를 차지하지 않는다.

<스스로 내보는 과제>

목적 :도서실 객체과 책 객체의 협력으로 작동되는 프로그램 제작

책 객체 : 저자, 제목 , 책과 저자 정보 출력.

도서실 객체 :

  • 과제 1 : 책 객체배열 생성, 인스턴스 미생성 . 출력
  • 과제 2 : 책 객체배열 생성x5,인스턴스 생성 ,입력, 출력

과제 3 : 객채 배열을 복사하는 방법 ()

  • 방법 : 별도의 객체 배열을 만들어서 인스턴스를 생성하고 . 각 인스턴스의 맴버변수를 복사해야 참조변수의 복사가 아니기 때문에 주소만 복사 되지 않는다.
    • 얕은 복사(Shallow Copy) : 복사된 배열이나 원본배열이 변경될 때 서로 간의 값이 같이 변경. (주소 복사)
    • 깊은 복사(Deep Copy) : 복사된 배열이나 원본배열이 변경될 때 서로 간의 값은 바뀌지 않음.
package objectArray_1;

import java.util.Arrays;

public class library {
	public static void main(String[] args) {
		book[] library = new book[5];
		//과제 1
		System.out.println(Arrays.toString(library));
		//과제 1+a
		library[0]=new book("A","B");
		System.out.println(Arrays.toString(library));
		//과제 2
		library[0]=new book("파스타는 다이어트 식품인가","다이어트 교사");
		library[1]=new book("다이어트 라면보다는 파스타인가","스파게티집 사장님");
		library[2]=new book("라면의 매운 맛과 게임으로 인한 도파민생성이 삶의 자극과 집중&깨어있음 에 영향을 미치는가","강아지");
		library[3]=new book("주인을 조종하는 방법","고양이");
		library[4]=new book("고양이에게 상한 음식을 주지 마라", "누님 고양이");
		for (int i = 0; i < library.length; i++) {
			library[i].showBookInfo();
		}
		//깊은 복사 : 객체를 별도로 생성해서 인스턴스도 별도로 생성해준다.
		System.out.println();
		System.out.println("==객체배열 복사 ==");
		book[] libraryCopy = new book[library.length];
		for (int i = 0; i < libraryCopy.length; i++) {
			libraryCopy[i]=new book();
			libraryCopy[i].setAuthor(library[i].getAuthor());
			libraryCopy[i].setTitle(library[i].getTitle());
		}
		
		for (int i = 0; i < libraryCopy.length; i++) {
			libraryCopy[i].showBookInfo();
		}
	}
}

강의 내용 체크 ( 복습 )

 


22. 2차원 배열 사용하기


강의 내용 정리

다차원 배열이란?

  • 한가지 공간에 2개 이상의 값을 저장할수 있는 배열

선언과 구조

  • 선언만 (값 입력X)
    • int[][] darr =new int[행 개수][열 개수];

자료형(int[][]) 변수명(darr : double array) = 생성자(new) 자료형(int[][]) 개수 입력([2][3]) ;

  • 선언과 값입력 동시에
    • int[][] darr = {{1,2,3,4},{2,1,5,5}}
      • int[][] darr ={{가로 한줄},{가로 한줄},{가로 한줄}}

<스스로 과제 내기>

열과 행의 개수가 다른 2차원 배열을 만들고. 출력하면서 자신의 배열의 개수를 출력하세요.

package objectArray_2;

public class darr {
	public static void main(String[] args) {
		int[][] darrA = {
				{1,2,3,4,5},
				{6,7,8},
				{9,10,11,12}};
		//darrA[세로열]
		//darrA[1]=1,2,3,4,5
		//darrA[2]=6,7,8
		//darrA[3]=9,10,11,12
		for (int i = 0; i < darrA.length; i++) {
			for (int j = 0; j < darrA[i].length; j++) {
				System.out.print(darrA[i][j]+" ");
			}
			System.out.println("["+darrA[i].length+"]");
		}
		
		//출력[Y][X]
		//darrA[0][0]= 1;
		//darrA[0][1]= 2;
		//darrA[2][1]= 10;
		
	
	}
}

강의 내용 체크 ( 복습 )

 


23. 객체 배열을 구현한 클래스 ArrayList


강의 내용 정리

ArrayList 란?

  • java.util 페키지에서 제공되는 ArrayList(클레스) 객체 배열 기능이다.
  • util 페키지에 class로 기능이 구현되어 있습니다.
  • 자바에서는 이런 기능을 직접 구현하려면 큰 프레임워크 단위의 도입에서 상속관계가 복잡해지기 떄문에 미연에 구현 되어있는 기능을 선언해서 사용해 줍시다.
  • 기존의 배열은 길이를 정해 선언하고. 더 커지면 더큰 배열에 복사해서 넣어야 했으나.
    • 배열의 요소를 추가하거나 제거, 이동하는 기능이 미리 구현 되어 있다.
  • ArrayList에 만들어져 있는 메소드 들이 배열로 메소드를 구현하는것보다 최적의 알고리즘으로 준비 되어 있기 떄문에 유용하게 사용할수 있다.

ArrayList 선언방법

ArrayList<객체> 변수명 = new ArrayList<객체>();

ArrayList의 메서드

  • boolean add(E e) : 요소 하나를 배열에 추가한다. E는 요소의 자료형을 의미한다.
  • int size() : 배열에 추가된 요소 전체의 개수를 반환한다.
  • E get(int index) : 배열의 index위치에 있는 값을 반환한다.
  • E remove(int index) : 배열의 index위치에 있는 값을 제거하고 그 값을 반환한다.
  • boolean isEmpty() : 배열이 비어 있는지 확인합니다.

스스로과제

library ArrayList 에 book (제목,작가)를 입력한후. 출력하는 메소드를 만들어 보자.

library

package ArrayList_1;

import java.util.ArrayList;
import objectArray_1.book;
public class library {
	public static void main(String[] args) {
		ArrayList<book> books = new ArrayList<book>();
		//<>제너럴 이라는  객체의 타입을 입력할때 사용하는 문법
		books.add(new book("스파게티 사장님", "다이어트 라면보다 스파게티가 다이어트에 좋다?"));
		books.add(new book("방탄커피 사장님", "방탄커피와 음식의외의 단신으로 내적 에너지 증폭가능"));
		for (int i = 0; i < books.size(); i++) {
			books.get(i).showBookInfo();
		}

	}
}

<강의정리>


강의 내용 체크 ( 복습 )


24. ArrayList를 활용한 간단한 성적 산출 프로그램


강의 내용 정리

강의 과제

1001학번 Lee와 1002학번 Kim, 두 학생이 있습니다.
Lee 학생은 국어와 수학 2과목을 수강했고, Kim 학생은 국어, 수학, 영어 3 과목을 수강하였습니다.
Lee 학생은 국어 100점, 수학 50점입니다.
Kim 학생은 국어 70점, 수학 85점, 영어 100점입니다.
Student와 Subject 클래스를 만들고 ArrayList를 활용하여 두 학생의 과목 성적과 총점을 출력하세요

<스스로 과제>

  • 객체 배열로 풀어보기(이전 쳅터 복습)
    • Student
    package ArrayList_2;
    
    public class Student {
    	private String studentName;
    	private int StudentNumber;
    	private static int number = 1000 ;
    	private int studentTotalScore;
    	public Student(String studentName) {
    		number++;
    		this.StudentNumber = number;
    		this.studentName = studentName;
    		
    		
    	}
    	public String getStudentName() {
    		return studentName;
    	}
    	public void setStudentName(String studentName) {
    		this.studentName = studentName;
    	}
    	public int getStudentNumber() {
    		return StudentNumber;
    	}
    	public void setStudentNumber(int studentNumber) {
    		StudentNumber = studentNumber;
    	}
    	public static int getNumber() {
    		return number;
    	}
    	public static void setNumber(int number) {
    		Student.number = number;
    	}
    	public void showStudentInfo() {
    		System.out.println("학번 : "+this.StudentNumber+" | 이름: "+this.studentName+" | 총점:"+studentTotalScore);
    	}
    	public void creatSubject(String subjectName,int subjectScore) {
    		Subject subject = new Subject();
    		subject.subjectName = subjectName;
    		subject.subjectScore = subjectScore;
    		studentTotalScore+=subjectScore;
    	}
    	
    }
    
    • Subject
    package ArrayList_2;
    
    public class Subject {
    	String subjectName ;
    	int subjectScore;
    	void showSubjectInfo() {
    		System.out.println("과목명:"+subjectName+"점수 :"+subjectScore);
    	}
    }
    
    • TEST
    package ArrayList_2;
    
    public class TEST {
    	public static void main(String[] args) {
    //		1001학번 Lee와 1002학번 Kim, 두 학생이 있습니다.
    //		Lee 학생은 국어와 수학 2과목을 수강했고, Kim 학생은 국어, 수학, 영어 3 과목을 수강하였습니다.
    //		Lee 학생은 국어 100점, 수학 50점입니다.
    //		Kim 학생은 국어 70점, 수학 85점, 영어 100점입니다.
    //		Student와 Subject 클래스를 만들고 ArrayList를 활용하여 두 학생의 과목 성적과 총점을 출력하세요
    		
    		//학생 : 이름, 학번(1000), 총점 맴버 변수가 있다.
    		//과목 : 과목의 인스턴스는 학생 의 내부에 생성된다. 과목명, 점수, 생성자로 학생의 총점에 자신의 점수를 리턴한다.
    		Student studentLee = new Student("Lee");
    		Student studentKim = new Student("kim");
    		studentLee.creatSubject("국어", 100);
    		studentLee.creatSubject("수학", 50);
    		studentKim.creatSubject("국어", 70);
    		studentKim.creatSubject("수학", 85);
    		studentKim.creatSubject("영어", 100);
    		studentLee.showStudentInfo();
    		studentKim.showStudentInfo();
    	}
    }
    

<강의 과제> ArrayList로 풀기

  • ArrayList와 객체 배열은 기본적으로 클레스의 맴버변수를 기반으로 인스턴스를 배열처럼 사용하는것은 동일하다.
  • 마찬가지로 학생 , 과목 클레스를 생성해서 . 학생1번 2번을 ArrayList에 넣고 그 안에 과목1번 2번을 ArrayList에 넣어서 계층 구조를 제작해보자.

Student

package ArrayList_3;

import java.util.ArrayList;

public class Student {
	private String StudentName;
	private int StudentNumber;
	private static int sirialNumber = 1000;
	private int totalScore;
	public Student(String StudentName) {
		this.StudentName = StudentName;
		sirialNumber++;
		this.StudentNumber = sirialNumber;
	}
	
	public void showStudentInfo() {
		System.out.println("학생명 : "+this.StudentName+" | 학번: "+this.StudentNumber+" | 총점: "+totalScore);
		for (int i = 0; i < subjectList.size(); i++) {
			System.out.println("과목:"+subjectList.get(i).getSubjectName()+" | 점수: "+subjectList.get(i).getSubjectScore());
		}
		System.out.println();
	}
	ArrayList<Subject> subjectList = new ArrayList<Subject>();
	public void addSubject(String subjectName, int subjectScore) {
		totalScore+=subjectScore;
		subjectList.add(new Subject(subjectName, subjectScore));
	}
}

Subject

package ArrayList_3;

public class Subject {
	private String subjectName;
	private int subjectScore;
	Subject(String subjectName,int subjectScore){
		this.subjectName = subjectName;
		this.subjectScore = subjectScore;
	}
	public void showSubjectInfo() {
		System.out.println("과목명:"+subjectName+"점수:"+subjectScore);
	}
	public String getSubjectName() {
		return subjectName;
	}
	public void setSubjectName(String subjectName) {
		this.subjectName = subjectName;
	}
	public int getSubjectScore() {
		return subjectScore;
	}
	public void setSubjectScore(int subjectScore) {
		this.subjectScore = subjectScore;
	}
	
}

Test

package ArrayList_3;

import java.util.ArrayList;

public class Test {
	public static void main(String[] args) {
		Student studentLee = new Student("Lee");
		studentLee.addSubject("국어", 100);
		studentLee.addSubject("수학", 50);
		Student studentKim = new Student("Kim");
		studentKim.addSubject("국어", 70);
		studentKim.addSubject("수학", 85);
		studentKim.addSubject("영어", 100);
		studentLee.showStudentInfo();
		studentKim.showStudentInfo();
	}
}


강의 내용 체크 ( 복습 )


개발 영어 어휘


에러 메세지의 이해


학습 타이머

 


 

캠 스터디


스터디 그룹

1) 카카오톡 오픈 채팅방

  - 모르는것 질문하기

  - 이해가 가지 않는 부분을 다른 분들이 블로그에서 정리한 글을 살펴보고 참고 하기

2) 구루미 온라인 독서실

  - 학습 시간 관리하기

  - 남들과 경쟁하기 

 

온라인 강의 주소

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

 

 


18. static 응용 - 싱글톤 패턴 (singleton pattern)


강의 내용 정리

싱글톤 패턴이란?


  • 프로그램에서 인스턴스가 단 한개만 생성되어야 하는 경우에 사용하는 디자인 패턴이다.
    • 디자인 패턴이란 개발과정에서 나타나게 되는 어떤 문제를 해결하기 위해 개발자들 사이에서 정리된 해결 계념에 이름을 붙인 것이다.
      • 조금 더 자세하게는 4명의 저자가 기존의 사례들을 분석해서 정리 해 놓은 서적에서 등장하는 조금더 객체지향적인 21가지의 설계 규칙 이다.
  • static 변수와 메서드를 활용해서 구현할수 있다.
  • 필요성 : 인스턴스란 무제한으로 생성될수 있는데. 계좌 잔액 처럼 데이터가 유일하게 하나만 이있어야 하는 경우에 사용한다.

구현하기


  • 클레스의 내부에서 생성자를 private으로 선언해서 외부의 접근을 차단한다.
    • 클레스가 외부에서 접근이 막히기 때문에 인스턴스의 추가 생성 기능이 불활성화 된다.
    • 내부의 매소드 get과 set만으로 단일한 class에 접근할수밖에 없게 된다
  • 1번에서 생성자를 만들었던 클레스 내부에 private static 생성자로 유일무이한 인스턴스를 생성한다.
    • 생성자라는 어휘가 혼용되는 2가지 경우가 전부 등장해서 구분이 어려울수 있다.
  • 싱글통 페턴으로 생성한 객체 내부에 get과 set 메소드도 다른 클레스에서 인스턴스 생성없이 사용할수 있게 되어야 하기 때문에 static 를 붙여서 생성한다.

Hanabank

package singletone_2;

public class Hanabank {
	private static Hanabank instance = new Hanabank();
	private Hanabank() {
		
	}
	public static Hanabank getHanabank () {
		if(instance ==null) {
			instance = new Hanabank();
		}
		return instance;
	}
}

testHanaback

package singletone_2;

public class testHanaback {
public static void main(String[] args) {
	Hanabank hanabank = Hanabank.getHanabank();
	System.out.println(hanabank);
}
}

강의 내용 체크 ( 복습 )

 


19. 복습해봅시다 (static과 싱클톤 패턴)


강의 내용 정리

코딩 과제 )

자동차 공장이 있습니다. 자동차 공장은 유일한 객체이고, 이 공장에서 생산되는 자동차는 제작될 때마다 고유의 번호가 부여됩니다.
자동차 번호가 10001부터 시작되어 자동차가 생산될 때마다 10002, 10003 이렇게 번호가 붙도록 자동차 공장 클래스, 자동차 클래스를 구현하세요
다음 CarFactoryTest.java 테스트 코드가 수행 되도록 합니다.

<스스로 생각하기>

  • 자동차 공장
    • 현제까지 만들어진 가장 최신 자동차의 시리얼 넘버
  • 자동차 인스턴스
    • 자동차마다 가지고 있는 시리얼 넘버
    • 시리얼 넘버를 출력할수 있는 메소드

Car

package carcompany_1;

public class Car {
	private int CarNum ;
	Car(int carnum){
		this.CarNum = carnum;
	}
	public int getCarNum() {
		return CarNum;
	}

	public void setCarNum(int carNum) {
		CarNum = carNum;
	}
	
}

CarFactory

package carcompany_1;

public class CarFactory {
	private static int SerialNumber =10000;
	private static CarFactory instance = new CarFactory();
	private CarFactory() {}
	public Car createCar(){
		this.setSerialNumber(getSerialNumber()+1);
		
		//Car mySonata = factory.createCar();
		return new Car(this.getSerialNumber()); 
	}
	public static CarFactory getInstance() {
		if(instance == null) {instance = new CarFactory(); }
		return instance;
	}
	public int getSerialNumber() {
		return SerialNumber;
	}
	public void setSerialNumber(int serialNumber) {
		SerialNumber = serialNumber;
	}
	
}

carFactoryTest

package carcompany_1;

public class carFactoryTest {
	public static void main(String[] args) {
		CarFactory factory = CarFactory.getInstance();
		Car mySonata = factory.createCar();
		Car yourSonata = factory.createCar();
		
		System.out.println(mySonata.getCarNum());     //10001 출력
		System.out.println(yourSonata.getCarNum());   //10002 출력
	}

}

강의 내용 체크 ( 복습 )

 


20. 자료를 순차적으로 한꺼번에 관리하는 방법 - 배열(array)


강의 내용 정리

 

  1. 자료를 순차적으로 한꺼번에 관리하는 방법 - 배열(array)

배열이란?

  • 동일한 자료형의 값을 모아 놓을수 있는 장소.(순서 중심으로)
  • 인덱스 연산자[인덱스]를 이용해서 빠른 참조가 가능하다.
  • 물리적 위치와 논리적 위치가 동일하다 . (메모리에 탑제 되는 형테 말하는듯?)
  • 순서가 0부터 시작된다. 요소가 10개면 0부터 9까지의 장소에 값이 들어 있다.
  • 자바에서는 다양한 자료형 들도 같이 넣을수 있는 ArrayList라는 배열 비스 무리한 class를 많이 활용하는 편이다. (어레이 는 util 에 들어있당)
    • 배열의 경우 저장되어있는 순서가 갖고 있는 의미가 너무 크기 떄문에 .배열에 값들이 입력 되는 중간에 빠져 있는 공간의 데이터를 처리하기 위한 처리가 진행되는 시간이 추가적으로 늘어난다.
  • new 로 생성했을경우 내부에 자료형의 초기값이 자동으로 들어간다.

선언하기

int[] arr1 = new int[10]; 또는 int arr1[] = new int[10];

사이즈

int = 1리터널 =4byte

10 = 10 리터널 = 40byte

  • 배열의 길이와 요소의 개수는 동일하지 않음
  • 배열은 선언한 개수만큼 메모리가 할당되지만. 실제 데이터는 없는 경우가 있음
  • 배얼의 length속성은 배열의 총 개수이기 때문에 요소가 비여있는 인덱스를 참조할수 있음.
    • 그렇기 때문에 요소의 개수 count 변수를 따로 유지 함.

과제

1. 배열의 길이와 요소의 개수를 따로 관리하기

package array_1;

public class TEST {
	public static void main(String[] args) {
		int[] intArrA = new int[10];
		int count = 0;
		intArrA[count]=1;
		count++;
		intArrA[count]=2;
		count++;
		intArrA[count]=3;
		count++;
		for (int i = 0; i < count; i++) {
			System.out.print(intArrA[i]+" ");
		}
	}
}
//출력 : 1 2 3

2. 문자 배열을 만들어 A-Z까지 입력하고 . 출력

package array_2;

import java.util.Arrays;

public class test1 {
	public static void main(String[] args) {
		char[] alphabet = new char[26];
		for (int i = 0; i < alphabet.length; i++) {
			alphabet[i]=(char) (65+i);
		}
		System.out.println(Arrays.toString(alphabet));
	}
}
//출력 :[A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z]

3. 향상된 for문 사용하기

import java.util.Iterator;

public class array_3 {
public static void main(String[] args) {
	int total = 0;
	int[] arr = {1,2,3,4,5,6,7,8,9,10};
	for(int num :arr ) {
		total+=num;
	}// 0부터 length까지 돌며 . 조건식의 첫번쩨 값에는 자료형 변수, 두번쩨 값에는 배열명이 들어간다. 
//조건식의 첫번쩨 변수에는 배열의 인덱스 0~length까지의 배열내의 값이 순서대로 한번씩 들어간다.
	System.out.println(total);
}
}

 

 


강의 내용 체크 ( 복습 )

 

 


개발 영어 어휘


에러 메세지의 이해


학습 타이머


캠 스터디

 


스터디 그룹

1) 카카오톡 오픈 채팅방

  - 모르는것 질문하기

  - 이해가 가지 않는 부분을 다른 분들이 블로그에서 정리한 글을 살펴보고 참고 하기

2) 구루미 온라인 독서실

  - 학습 시간 관리하기

  - 남들과 경쟁하기 

 

온라인 강의 주소

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

 

 


16. 여러 인스턴스에서 공통으로 사용하는 변수를 선언하자 - static 변수


강의 내용 정리

STATIC 변수

여러 인스턴스에서 공통으로 사용하는 변수를 선언할때

< 스스로의 생각 정리 >

  • 최상위의 클레스에서 선언한 변수를 하위 클레스에서 사용할수 있을까
  • 각 객체를 인스턴스로 만들고 내부의 변수를 불러오는것 으로는 것으로 어차피 모든 클레스 내부의 값이 공용으로 사용가능한것이 아닌가.
  • 여기까지가 내가 현제 구현할수 있는 공용 변수의 한계인것 같다.

< 강의에서 새로운 방법 배우기 >

  • 여러 인스턴스가 공유하는 기준값이 필요할때
    • 학생 객체로 만들어지는 인스턴스속의 학번 맴버변수가 인스턴스가 하나씩 만들어질떄마다 1씩 증가하 도록만들때
  • 쉽게 이야기 하자면 STATIC 변수는 여러 인스턴스에서 자신의 값을 유지하고 있는 단일한 존제이다. 후후

Static 변수 A 와 인스턴스간의 관계도

변수 A ← 인스턴스 A

변수 A ← 인스턴스 B

변수 A ← 인스턴스 C

선언과 메모리

선언

Static int staticIntA;

메모리

staticintA는 인스턴스가 만들어질때 메모리에 팁제되지 않고.

처음 프로그램이 실행 되자 마자 메모리에 할당되어 사용가능한 프로세서(스텐바이) 상태가 된다.

예 )

Student객체로 생성된 인스턴스속 맴버변수와 공용 변수 static

Student객체 “Lee” 인스턴스를 생성하면 참조주소의 레퍼런스 벨류 속 맴버 변수에서 제외 되게 된다.

  • String StudentName ;
  • static StucentNumber = 1000;

사용방법

A 클레스의 int IntA에 접근시

A를 기반으로 생성된 인스턴스.intA 로 접근하지 않고.

A.intA로 클레스에 바로 접근한다.

CODE TEST

A

package static_test_3;

public class A {
	static int number = 1000 ;
	int StudentNumber ;
	String name ;
	A(String name){
		this.name=name;
		this.StudentNumber=number;
		this.number++;
	}
	
	public void print() {
		System.out.println("===A반 학생 정보조회===");
		System.out.println("학번:"+this.StudentNumber);
		System.out.println("성명:"+this.name);
	}
}

controller

package static_test_3;

public class controller {
	public static void main(String[] args) {
		A a = new A("고양아");
		a.print();
		A b = new A("나비야");
		b.print();
		A c = new A("어흥이");
		c.print();
	
		a.print();
		A.number++;// 번호 한칸 띄울수 있다. 클레스 이름.변수로 바로 사용한다.
		A d = new A("카옹이");
		d.print(); // 학번 1003번 제외
		
		
	}
}

변수에 따른 메모리의 장소 (맛보기)

main 안에 선언된 변수

  • static void main 이라는것은 고용 인데 자동으로 시작되는 기능을 갖고 있는 메소드 이기 떄문에.
    • 메서드 내부의 변수는 전부 지역 변수 이다.
    • 지역변수는 전부 스택 메모리에 탑제 된다.
    • 객체를 기반으로 만들어지는 인스턴스는 객체 타입의 참조 변수로서 볼수 있지만 . 예외적으로 메모리가 동적으로 관리 되는 힙 메모리에 탑제 된다.
    • 스텍 메모리에는 보통 실행되고 끝날때까지 주소가 유지 되는 상수나. static 변수가 있는것 같다.
    • 데이터 영역(공통) → 스택 메모리 →힙메모리
    • static값 →student(클레스) →studentLee(인스턴스)

강의 내용 체크 ( 복습 )


17. static 메서드의 구현과 활용, 변수의 유효 범위


강의 내용 정리

<스스로 정리>

Student의 객체에서 serialNum의 접근 지정자를 private 속성으로 하여. Getter/setter 코드를 구현.

  • static 변수는 인스턴스와 저장되는 메모리가 다르기 때문에 같은 메모리에 저장되는 static 메소드로 접근 하여야 한다.
  • static 메소드는 스택 메모리에 탑제 되어있고. 인스턴스 내부의 변수들은 힙메모리에 탑죄되어 저장되는 메모리가 다르기 때문에 static 메서드의 내부에서의 인스턴스 변수가 사용될경우 static 메서드가 생성자보다 먼저 실행 될수 있기 때문에.(인스턴스를 생성하기 전에 class명으로 변수명에 접근하거나 하는 상황) 오류로 지정하여 사용을 할수 없게 했다.
  • 변수의 scope(유효범위)와 life cycle(생명주기)는 변수의 종류에 따라서 다르다.

변수 유형 선언 위치 사용 법위 메모리 생성과 소멸

지역변수 함수 내부에 선언 함수 내부에서 스택 생성:함수호출,소멸:함수끝
맴버변수(인스턴스 변수) 클레스 내부에 변수로 선언 클래스 내부와 private가 아니면 참조변수로 다른 클레스에서도 사용한다. 인스턴스가 생성될때 힙에 생성되며 , 가비지 컬렉터가 메모리를 수거할 때 소멸한다.
static 변수(클레스 변수) Static 예약어를 사용하며 클래스 내부에 선언한다. 클래스 내부에서 사용하고 private이 아니면 클래스 이름으로 다른 클레스에서 사용가능 데이터 영역 생성: 프로그램 실행.소멸: 프로그램이 끝나고 메모리를 해제할 때
  • static 메모리는 계속 메모리를 차지하고 있기 떄문에 너무 큰 메모리를 할당하는것을 피해야 한다.
  • 클래스 내부의 여러 메서드에서 사용하는 변수는 맴버 변수로 선언하는것이 좋다.
  • 멤버 변수가 너무 많으면 인스턴스 생성시 쓸데없는 메모리가 할당된다.
  • 상황에 적절하게 변수를 사용해야 한다.
  • 싱글톤 페턴에서 static가 많이 사용됩니다 .

TEST

package static_test_4;

public class Student {
	
private static int serialNum ;
private String StudentName;
private int StudentNum;

public static int getSerialNum() {
	return serialNum;
	//static 메소드 내부에서는 맴버 변수를 사용하면 오류가 생갑니다.
}
public static void setSerialNum(int serialNum) {
	Student.serialNum = serialNum;
}
public String getStudentName() {
	return StudentName;
}
public void setStudentName(String studentName) {
	StudentName = studentName;
}
public int getStudentNum() {
	return StudentNum;
}
public void setStudentNum(int studentNum) {
	StudentNum = studentNum;
}
public void print() {
	System.out.println("#학성정보조회");
	System.out.println(StudentNum+"번 : "+this.StudentName);
}
}

강의 내용 체크 ( 복습 )

 


개발 영어 어휘


에러 메세지의 이해


학습 타이머


 

캠 스터디


스터디 그룹

1) 카카오톡 오픈 채팅방

  - 모르는것 질문하기

  - 이해가 가지 않는 부분을 다른 분들이 블로그에서 정리한 글을 살펴보고 참고 하기

2) 구루미 온라인 독서실

  - 학습 시간 관리하기

  - 남들과 경쟁하기 

 

온라인 강의 주소

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

 

 

 


15. 복습해봅시다 (객체 협력)


강의 내용 정리

이번 챕터는 이전 챕터의 코드에 선생님께서 추가해 주신 상황을 스스로 제작하여 이제까지의 연습을 확인하는 챕터 입니다.

 

과제 :

에드워드는 지각을해서 택시를 타야 했습니다.

20000원을 가지고 있었는데 10000원을 택시로 사용했습니다.

택시는 “잘나간다 운수 “ 회사 택시를 탔습니다.

 

Bus

package BUS;

public class Bus {
	int passagier ;
	int lineNum ;
	public Bus(int lineNum) {
		this.lineNum=lineNum;
	}
	public void print() {
		System.out.println(lineNum+"번 버스는 고객이"+passagier+"명 탑승했습니다");
	}
}

controller

package BUS;

public class controller {
	public static void main(String[] args) {
		take take = new take();
		Customer studentA = new Customer(1000,"고양이");
		Customer StudentB = new Customer(2000, "강아지");
		Customer womanA = new Customer(2000, "영심이");
		Subway SubwayA = new Subway(2);
		Bus busA = new Bus(2001);
		
		take.bus(studentA, busA);
		take.Subway(StudentB, SubwayA);
		take.bus(womanA,busA);
	
		studentA.print();
		StudentB.print();
		SubwayA.print();
		busA.print();
		
		System.out.println();
		Customer StudentC = new Customer(20000, "에드워드");
		taxi taxiA = new taxi("잘나간다 운수",10000);
		take.taxi(StudentC, taxiA);
		
		StudentC.print();
	}
}

Customer

package BUS;

public class Customer {
	int money ;
	String name ;
	
	public Customer(int money , String name) {
		this.money=money;
		this.name=name;
	}
	
	
	
	public void print() {
		System.out.println(name+"는 돈이"+money+"원이 남았습니다");
	}
}

Subway

package BUS;

public class Subway {
	int passagier ;
	int lineNum ;
	public Subway(int lineNum) {
		this.lineNum=lineNum;
	}
	public void print() {
		System.out.println("지하철"+lineNum+"호선은 고객의 수가"+passagier+"명 입니다");
	}
}

take

package BUS;

public class take {
	
		public void bus(Customer customer, Bus bus) {
			customer.money -=1200;
			bus.passagier++;
		}
		public void Subway(Customer customer,Subway subway) {
			customer.money-=1000;
			subway.passagier++;
		}
		public void taxi(Customer customer, taxi taxi) {
			System.out.println(customer.name+"는 지각을해서 택시를 타야 했습니다");
			System.out.println(customer.money+"원을 가지고 있었는데 10000원을 택시비로 사용했습니다");
			customer.money-=10000;
			System.out.println("택시는 \\""+taxi.companyName+"\\"회사 택시를 탔습니다");
		}
	
}

taxi

package BUS;

public class taxi {
	String companyName ;
	int money ;
	
	public taxi(String taxiName,int money) {
		this.companyName = taxiName;
		this.money = money;
	}
	
	
}

강의 내용 체크 ( 복습 )

 


강의 챕터명


강의 내용 정리

 


강의 내용 체크 ( 복습 )

 


개발 영어 어휘


에러 메세지의 이해


학습 타이머


 

캠 스터디

 


스터디 그룹

1) 카카오톡 오픈 채팅방

  - 모르는것 질문하기

  - 이해가 가지 않는 부분을 다른 분들이 블로그에서 정리한 글을 살펴보고 참고 하기

2) 구루미 온라인 독서실

  - 학습 시간 관리하기

  - 남들과 경쟁하기 

 

온라인 강의 주소

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

 

 


14. 버스 타고 학교 가는 학생의 과정을 객체 지향 프로그래밍으로 구현해보기


강의 내용 정리

직접 코딩해 보는 챕터 입니다.

강의 내용정리 챕터에서는 과제만으로 임의 대로 처리하였고

복습 쳅터에서 재대로 강의의 의도대로 코딩이 진행됩니다.

Bus

package S14;

public class Bus {
	//버스 : 총 좌석, 현제 고객 수 , 빈 좌석수 , 오늘의 총 고객수. 요금 추가 가산 거리 , 사용할수 있는 고통카드 서비스의 종류
	private int busFare ; // 버스 요금
	private int busNumber ;
	private int totalSeatNumber ; // 총 좌석의 수
	private int nowPassenger ; // 승객
	private int emptySeat ; // 빈 좌석수
	private int todayTotalpassenger ; // 금일의 총 승객의 수
	private int additionalChargeDistance ; // 추가 요금 가산 거리
	private String[] creditCardService ; // 사용가능한 카드 서비스
	private boolean isvalid ; // 적합성 확인
	
	
	Bus(int busNumber ,int busFare, int totalSeatNumber,int nowPassenger,int emptySeat,int todayTotalpassenger, int additionalChargeDistance,String[] creditCardService){
		setBusFare(busFare);
		setTotalSeatNumber(totalSeatNumber);
		setNowPassenger(nowPassenger);
		setEmptySeat(emptySeat);
		setTodayTotalpassenger(todayTotalpassenger);
		setAdditionalChargeDistance(additionalChargeDistance);
		setCreditCardService(creditCardService);
		setBusNumber(busNumber);
	}
	
	
	public int getBusNumber() {
		return busNumber;
	}

	public void setBusNumber(int busNumber) {
		this.busNumber = busNumber;
	}

	public int getBusFare() {
		return busFare;
	}

	public void setBusFare(int busFare) {
		busFare = busFare;
	}

	public int getTotalSeatNumber() {
		return totalSeatNumber;
	}
	public void setTotalSeatNumber(int totalSeatNumber) {
		this.totalSeatNumber = totalSeatNumber;
	}
	public int getNowPassenger() {
		return nowPassenger;
	}
	public void setNowPassenger(int nowPassenger) {
		this.nowPassenger = nowPassenger;
	}
	public int getEmptySeat() {
		return emptySeat;
	}
	public void setEmptySeat(int emptySeat) {
		this.emptySeat = emptySeat;
	}
	public int getTodayTotalpassenger() {
		return todayTotalpassenger;
	}
	public void setTodayTotalpassenger(int todayTotalpassenger) {
		this.todayTotalpassenger = todayTotalpassenger;
	}
	public int getAdditionalChargeDistance() {
		return additionalChargeDistance;
	}
	public void setAdditionalChargeDistance(int additionalChargeDistance) {
		this.additionalChargeDistance = additionalChargeDistance;
	}
	public String[] getCreditCardService() {
		return creditCardService;
	}
	public void setCreditCardService(String[] creditCardService) {
		this.creditCardService = creditCardService;
	}
	
	
	
}

Controller

package S14;

import java.util.Arrays;

public class Controller {
public static void main(String[] args) {
	//상황 : 학생이 버스에 타는과정
		// 조건 :계좌 잔액으로 선불 지급, 현제 일반 좌석 3개 , 기다리고 있는 버스 2013 번, 
		//학생 :  계좌 잔액 , 기다리고 있는 버스 번호, 가지고 있는 교통 카드의 종류, 환승 여부,
		//버스 : 총 좌석, 현제 고객 수 , 빈 좌석수 , 오늘의 총 고객수. 요금 추가 가산 거리 , 사용할수 있는 고통카드 서비스의 종류, 환승 요금 계산  
	// 코드 제작 요점 : 아직 입력방법은 학습하기 이전익 때문에 코드를 통해서 값을 입력하기로한다.
	// 코드 실행 순서 : 학생이 우선 등장하고 다른 종류의 버스가 연달아 등장하며. 학생이 타려고 하는 버스와 사용가능한 카드서비스 일 경우 버스를 탈수 있다.
	String useCardName = "" ;
	Student Man1 = new Student(10000, 2016, "Tmoney", false);
	System.out.println("학생 정보");
	System.out.println("계좌 잔액 : "+Man1.getMoney()+"원");
	System.out.println("교통카드 서비스 : "+Man1.getCashCardService());
	System.out.println("환승 : "+Man1.getTransfer());
	System.out.println();
	System.out.println();
	String[] availablecardSevice= {"Tmoney","cashbee"};
	Bus Bus_2016 = new Bus(2016,720, 28, 12, 28-12, 120, 10,availablecardSevice)  ; 
	System.out.println("버스 정보");
	System.out.println("번호:"+Bus_2016.getBusNumber());
	System.out.println("사용가능한 교통카드 서비스 : "+Arrays.toString(Bus_2016.getCreditCardService()));
	System.out.println("남은좌석:"+(Bus_2016.getTotalSeatNumber()-Bus_2016.getNowPassenger())+"석");
	System.out.println("요금 추가 가산 시작 거리: "+Bus_2016.getAdditionalChargeDistance()+"정거장");
	System.out.println();
	//입력데이터의 검증은 각 class 내부의 set메소드에서 수행한다. 
	if(Man1.getMoney()>=Bus_2016.getBusFare()) {
		if(Man1.getWaitingBusNumber()==Bus_2016.getBusNumber()) {
			
				boolean check = false;
				
				for (int i = 0; i < Bus_2016.getCreditCardService().length; i++) {
					
					if(Bus_2016.getCreditCardService()[i].equals(Man1.getCashCardService())) {
						check = true;
						useCardName=Bus_2016.getCreditCardService()[i];
					}
				}
				if(check == true) {
					Bus_2016.setEmptySeat(Bus_2016.getEmptySeat()-1);
					System.out.println("=결과=");
					System.out.println("학생");
					System.out.println("탑승 여부 : 성공");
					System.out.println("사용한 카드 :" +useCardName);
					System.out.println();
					System.out.println("버스");
					System.out.println("남은좌석:"+Bus_2016.getEmptySeat()+"석");
					System.out.println();
					System.out.println();
				}else {
					System.out.println("학생이 사용하는 교통카드 서비스와 버스에서 사용할수 있는 교통카드 서비스가 일치하지 않습니다");
				}
			}else {
				System.out.println(Man1.getWaitingBusNumber());
				System.out.println(Bus_2016.getBusNumber());
				System.out.println("학생이 기다리는 버스의 번호와 일치하지 않습니다");
			}
		
	}else {
		System.out.println("계좌의 잔액이 부족하여 버스 요금을 지불할수 없어 . 탑승하지 못하였습니다.");
}}
}

Student

package S14;

public class Student {
	//학생 :  계좌 잔액 , 기다리고 있는 버스 번호, 가지고 있는 교통 카드의 종류, 환승 여부,
	private int money ; // 지불 조건 재한 : 선불로 계좌에 남아있는 금액 지불 , 금액이 없을시 탑승 실패
	private int waitingBusNumber ; // 기다리고 있는 버스 번호  // 버스 번호가 일치하지 않을시 탑승 보류
	private String CashCardService ; // 가지고 있는 카드의 교통카드 서비스 , 교통카드 서비스가 일치하면 탑승 가능
	private boolean Transfer ; // 환승여부 환승한 고객일 경우 국가에서 비용을 지불함으로 비용 발생 없음.
	private boolean isvalid; // 입력된 데이터의 안전성 검증
	
	Student(int money ,int WaitingBusNumber,String CashCardService,boolean Transfer){
		isvalid = true;
		setMoney(money);
		setWaitingBusNumber(WaitingBusNumber);
		setCashCardService(CashCardService);
		setTransfer(Transfer);
	}
	public int getMoney() {
		return money;
	}
	public void setMoney(int money) {
		if(money<0) {
			isvalid=false;
		}else {
			this.money = money;
			}
	}
	public int getWaitingBusNumber() {
		return waitingBusNumber;
	}
	public void setWaitingBusNumber(int waitingBusNumber) {
		this.waitingBusNumber = waitingBusNumber;
	}
	public String getCashCardService() {
		return CashCardService;
	}
	public void setCashCardService(String cashCardService) {
		this.CashCardService = cashCardService;
	}
	public boolean getTransfer() {
		return Transfer;
	}
	public void setTransfer(boolean transfer) {
		this.Transfer = transfer;
	}
	
	

}

 


강의 내용 체크 ( 복습 )

Bus

package BUS;

public class Bus {
	int passagier ;
	int lineNum ;
	public Bus(int lineNum) {
		this.lineNum=lineNum;
	}
	public void print() {
		System.out.println(lineNum+"번 버스는 고객이"+passagier+"명 탑승했습니다");
	}
}

controller

package BUS;

public class controller {
	public static void main(String[] args) {
		take take = new take();
		Customer studentA = new Customer(1000,"고양이");
		Customer StudentB = new Customer(2000, "강아지");
		Customer womanA = new Customer(2000, "영심이");
		Subway SubwayA = new Subway(2);
		Bus busA = new Bus(2001);
		
		take.bus(studentA, busA);
		take.Subway(StudentB, SubwayA);
		take.bus(womanA,busA);
	
		studentA.print();
		StudentB.print();
		SubwayA.print();
		busA.print();
		
	}
}

customer

package BUS;

public class Customer {
	int money ;
	String name ;
	
	public Customer(int money , String name) {
		this.money=money;
		this.name=name;
	}
	
	
	
	public void print() {
		System.out.println(name+"는 돈이"+money+"원이 남았습니다");
	}
}

Subway

package BUS;

public class Subway {
	int passagier ;
	int lineNum ;
	public Subway(int lineNum) {
		this.lineNum=lineNum;
	}
	public void print() {
		System.out.println("지하철"+lineNum+"호선은 고객의 수가"+passagier+"명 입니다");
	}
}

take

package BUS;

public class take {
	
		public void bus(Customer customer, Bus bus) {
			customer.money -=1200;
			bus.passagier++;
		}
		public void Subway(Customer customer,Subway subway) {
			customer.money-=1000;
			subway.passagier++;
			
		}
	
}

 


개발 영어 어휘


 

에러 메세지의 이해

 


학습 타이머


 

캠 스터디

 


스터디 그룹

 

1) 카카오톡 오픈 채팅방

  - 모르는것 질문하기

  - 이해가 가지 않는 부분을 다른 분들이 블로그에서 정리한 글을 살펴보고 참고 하기

 

 

2) 구루미 온라인 독서실

  - 학습 시간 관리하기

  - 남들과 경쟁하기 

 

 

온라인 강의 주소

패스트 캠퍼스에서 공지한 링크가 막혔습니다. 17일에 새로운 링크를 내려 주시면 수정 해야 할것 같습니다  : )

 

 

+ Recent posts