728x90

 

로그인 코드 연습

 

public class practice_everyday03 {

	public static void main(String[] args) {

		// 전체 유저 목록
		// 현재유저 아이디 암호 입력
		// 유저 목록에 있는 체크(반복문)
		// 로그인 완료 메세지
		
		String[][] users_all = {
				{"choi","1111"},
				{"kim","2222"},
				{"lee","3333"}
		};
		String[][] user_current = {
				{args[0]},
				{args[1]} // id pw 따로 받아야하나?		
		};
		
		
		boolean userLogin = false;
		for (int i = 0; i < users_all.length; i++) { // 2차원 배열이지만 안에 배열 갯수를 세온다
//			System.out.println(users_all[i][0]);
//			System.out.println(users_all[i][1]);
//			System.out.println(user_current[i]); // 디버깅 중 출력값 무엇?? [Ljava.lang.String;@6504e3b2 ??
												// current의 배열길이는 전체 두개인데 i변수는 all의 길이이므로 인덱스번호가 안맞아서 오류
//			String[] user_current_IdPw = user_current;
//			if (user_current_IdPw[0].equals(users_all[i][0]) && // 계속 로그인실패만 뜨는데 뭐가 문제지?
//				user_current_IdPw[1].equals(users_all[i][1])	
//						) {
//			if (user_current[0].equals(users_all[i][0]) &&  // 계속 로그인실패만 뜨는데 뭐가 문제지?
//				user_current[1].equals(users_all[i][1])		
//					) {
				userLogin = true;
				break;
			};
//		};
			
		
		if (userLogin) {
			System.out.printf("로그인 성공%n환영합니다");
		} else {
			System.out.println("로그인 실패");
		}
		
	}

}

 

 

728x90
반응형
728x90

 

상속(Inheritance) 정의

특정 클래스의 변수, 메소드확장,상속해서 다른 클래스갖도록 하는 것

 

상속의 장점

  1. 코드의 재사용성up
  2. 유지보수 편의성 up
  3. 가독성 up
  4. 코드의 양 down

 

 

 

  • 부모클래스(=superClass)
  • 자식클래스(=subClass)

 

부모 클래스 기능에서 자식 클래스추가 & 재정의(오버라이딩) 가능

 

오버라이딩(Overriding)

부모가 가진 기능재정의(수정)하는 것을 오버라이딩(Overriding)

예시)

class Cal33 extends Cal11{		// extends : Cal1을 상속
	public int minus(int v1, int v2) {
		return v1-v2;			// Cal3는 이제 부모 클래스가 없는 마이너스 기능도 탑재
	}
	public int sum(int v1, int v2) {
		System.out.println("Cal3!!");
		return v1+v2;    // 부모가 가진 기능을 재정의(수정)
	}
}

 

 

오버로딩(Overloading)

뜻 : 과적하다

부모클래스도 자식클래스도 오버로딩 가능. 자식 클래스는 부모 클래스를 오버라이딩, 오버로딩 둘 다 가능

자바는 형태다르같은 이름메소드를 같은 클래스 내에서도 여러개 사용 가능

class Cal11 {
	public int sum(int v1, int v2) {
		return v1+v2;
	}
	public int sum(int v1, int v2, int v3) { // 같은 이름 메소드 // int v3 추가
		return v1+v2+v3;
	}
}

 

 


 

 

this는 자기 자신

class Cal111 {
	// this
	// 자기 자신을 뜻함
	public int sum(int v1, int v2, int v3) { 
		return this.sum(v1,v2)+v3;	    // .sum() 자기자신
	}
}

 

 

super는 자신의 부모

자식 클래스의 메소드가 부모 클래스의 메소드를 호출하고 그 결과를 이용할 수 있게 하는 것

super.부모클래스의 메소드명;

breakpoint로 디버깅체크 가능

public int sum(int v1, int v2){
		return super.sum(v1,v2);
}

super의 사용 예시

class Cal1111 {
	int v1,v2;				  	        // 정수 데이터타입 세팅
	Cal1111(int v1, int v2) { 	  // 생성자 
		this.v1 = v1; this.v2 = v2; // this.v1의 v1은 class Cal1111 { 아랫줄 int v1
		//매개변수에 들어온 값				// this.v1 = v1;에서 v1;은 Cal1111(int v1, int v2)에서 int v1
		System.out.println("Cal init!!!");
	}
}
class Cal3333 extends Cal1111{  // extends : Cal1을 상속
	Cal3333(int v1, int v2) {
		**super**(v1, v2);	// **super**=부모클래스. 즉,부모클래스의 생성자를 실행시킴. 
						// 부모클래스의 생성자는 아래와 같다
						// Cal1111(int v1, int v2) {
						// 		this.v1 = v1; this.v2 = v2;
	System.out.println("Cal3 init!!!");
	}
}
public class Inheritance05 {
	public static void main(String[] args) {
		// new cal() 안에 입력값 2,1 새로 입력
		Cal1111 c1 = new Cal1111(2,1); // 출력 : 클래스cal1에서 println() 한번만 출력 
		Cal3333 c3 = new Cal3333(2,1); // 출력 : super(v1, v2); 이 문구가 
									   // 클래스cal1에서 println() 한번 출력시키고
									   // 클래스cal3에서 println() 한번 출력시켜 두번출력
	}
}

 

 

생성자(Constructor)

자식 클래스에서 부모클래스를 계승 받아 실행하게 될 때, 반드시 부모클래스의 생성자를 실행해야한다

ex)

class Cal1111 {
	int v1,v2;				  	      // 정수 데이터타입 세팅
	Cal1111(int v1, int v2) { 	// 생성자 
		this.v1 = v1; this.v2 = v2;
		//매개변수에 들어온 값
	}
}
class Cal3333 extends Cal1111{    // error 발생
}
public class Inheritance05 {
	public static void main(String[] args) {
		
		Cal1111 c1 = new Cal1111(2,1); // new cal() 안에 입력값 2,1입력
		Cal3333 c3 = new Cal3333();
	}
}

생성자(Constructor) 메커니즘

오리지널 클래스(cal)를 제대로 계승했다면, Cal이 인스턴스로 만들어질 때 반드시 해야되는 일들이 생성자에 들어있다. 때문에 이 생성자를 Cal3도 실행시켜야만 제대로 작동한다

 

 


 

다형성(Polymorphism)

자식 클래스를 부모클래스로써 동작하도록 규제하는 기능

ParentClass obj = new ChildClass()

 

다형성(polymorphism)이란 하나의 객체여러 가지 타입을 가질 수 있는 것

자바에서는 이러한 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 하여 구현

 

접근제어자(Access Modifers)

public, default, protected, private

클래스,메소드,변수를 사용자들이 아무거나 건드리지 못하게 제한하는 기능

 

Final

내가 만든 클래스를 다른 사람이 더이상 상속하게 하고 싶지 않을 때

메소드를 오버라이딩(Overriding)하게 하고 싶지않을 때

변수를 다른 사람이 마음대로 수정하게 하고 싶지 않을 때

이런 규제를 하고 싶다면 final을 사용

 

Abstract

final과 반대

클래스를 상속해서 사용하려는 사람에게 어떤 특정 메소드는 꼭 구현해라라고 강제하고 싶은 메소드가 있다면 사용

상속자가 직접 구현해야 하는 기능을 구현하도록 강제할 수 있다

Abstract Class Imcompletion

 

 

728x90
반응형
728x90

 

다형성(Polymorphism)이란?

자식 클래스를 부모클래스로써 동작하도록 규제하는 기능

ParentClass obj = new ChildClass()

 

다형성(polymorphism)이란 하나의 객체여러 가지 타입을 가질 수 있는 것

자바에서는 이러한 다형성을 부모 클래스 타입의 참조 변수자식 클래스 타입의 인스턴스참조할 수 있도록 하여 구현

 

 

접근제어자(Access Modifers)

public

default

protected

private

클래스,메소드,변수를 사용자들이 아무거나 건드리지 못하게 제한하는 기능

유저가 건드리면 안되는 영역 또는 기능들제한하여 프로그램을 보호한다

ex)스마트폰 외부만 유저가 조작할 수 있게하고 내부는 제한하는 것

 

 

Final

내가 만든 클래스를 다른 사람이 더이상 상속하지 못하게 하고 싶을 때

메소드를 오버라이딩(Overriding)하게 하고 싶지않을 때

변수를 다른 사람이 마음대로 수정하게 하고 싶지 않을 때

이런 규제를 하고 싶다면 final을 사용

 

 

Abstract

final과 반대

클래스상속해서 사용하려는 사람에게 어떤 특정 메소드는 꼭 구현해라라고 강제하고 싶은 메소드가 있다면 사용

상속자가 직접 구현해야 하는 기능을 구현하도록 강제할 수 있다

Abstract Class Imcompletion

728x90
반응형
728x90

 

상속(Inheritance)의 생성자(Contructor)

 

Cal 클래스가 생성자가 있다고하면 어떻게 될지 보자

class Cal1111 {
	int v1,v2;				  	      // 정수 데이터타입 세팅
	Cal1111(int v1, int v2) { 	// 생성자 
		this.v1 = v1; this.v2 = v2;
		//매개변수에 들어온 값
	}
}
class Cal3333 extends Cal1111{    // error 발생
}
public class Inheritance05 {
	public static void main(String[] args) {
		
		Cal1111 c1 = new Cal1111(2,1); // new cal() 안에 입력값 2,1입력
		Cal3333 c3 = new Cal3333();
	}
}

위와 같이 코드를 작성하니 아래와 같이 에러가 발생했다

오리지널 클래스(cal)을 제대로 계승했다면, Cal이 인스턴스로 만들어질 때 반드시 해야되는 일들이 생성자에 들어있다. 때문에 이 생성자를 Cal3도 실행시켜야만 제대로 작동한다

자식 클래스에서 부모클래스를 계승 받아 실행하게 될 때, 반드시 부모클래스생성자실행하도록 규칙을 만들어 놓은 것.

 

 

아래의 코드를 실행할 경우

부모클래스인 cal1에서 println() 한번 : Cal init!!!

자식클래스인 cal3에서 println() 두번 : Cal init!!! & Cal3 init!!!

자식클래스인 cal3에서 super(v1, v2);가 부모클래스 생성자를 실행키는데 이 코드가 부모코드의 println()을 한번 더 실행켜서 cal 한번 cal3 자체에서 한번 더 실행되서 총 두번이 출력되는 것

class Cal1111 {
	int v1,v2;				  	// 정수 데이터타입 세팅
	Cal1111(int v1, int v2) { 	// 생성자 
		this.v1 = v1; this.v2 = v2;
		//매개변수에 들어온 값
		System.out.println("Cal init!!!");
	}
}
class Cal3333 extends Cal1111{  // extends : Cal1을 상속
	Cal3333(int v1, int v2) {
		**super**(v1, v2);	// **super**=부모클래스. 즉,부모클래스의 생성자를 실행시킴. 
						// 부모클래스의 생성자는 아래와 같다
						// Cal1111(int v1, int v2) {
						// 		this.v1 = v1; this.v2 = v2;
	System.out.println("Cal3 init!!!");
	}
}
public class Inheritance05 {
	public static void main(String[] args) {
		// new cal() 안에 입력값 2,1 새로 입력
		Cal1111 c1 = new Cal1111(2,1); // 출력 : 클래스cal1에서 println() 한번만 출력 
		Cal3333 c3 = new Cal3333(2,1); // 출력 : super(v1, v2); 이 문구가 
									   // 클래스cal1에서 println() 한번 출력시키고
									   // 클래스cal3에서 println() 한번 출력시켜 두번출력
	}
}

전체코드

728x90
반응형
728x90

 

상속과 관련된 중요 키워드

this자기 자신

super자신의 부모

 

cal3클래스의 sum메소드는 부모클래스인 cal의 sum메소드를 오버라이딩하고 있음

이 코드가 엄청나게 복잡한 코드였다면 같은 기능의 코드를 중복해서 쓰는 낭비가 많았을 것

class Cal111 {
	public int sum(int v1, int v2) {
		return v1+v2;
	}
	public int sum(int v1, int v2, int v3) { // 같은 이름 메소드 // int v3 추가
		return v1+v2+v3;
	}
}
class Cal333 extends Cal11{		// extends : Cal1을 상속
	public int minus(int v1, int v2) {
		return v1-v2;			// Cal3는 이제 부모 클래스가 없는 마이너스 기능도 탑재
	}
	public int sum(int v1, int v2) {
		System.out.println("Cal3!!");
		return v1+v2;
	}
}

이럴 때 계승 발전 시키면 매우 유리할 것

자식 클래스의 메소드(sum)가 부모 클래스의 메소드(sum)를 호출하고 그 결과를 이용할 수 있다면 편리할 것. 이때 쓰는 것이 super

 

super.

자식 클래스의 메소드가 부모 클래스의 메소드를 호출하고 그 결과를 이용하는 것

super.부모클래스의 메소드명;

public int sum(int v1, int v2){
		return super.sum(v1,v2);
}

super가 잘 작동하는지 체크해보고 싶다면?

브레이크포인트 걸고 디버깅 해볼 것

 

this.

class Cal111 {
	// this
	// 자기 자신을 뜻함
	public int sum(int v1, int v2, int v3) { 
		return this.sum(v1,v2)+v3;	    // .sum() 자기자신
	}
}

 

 

전체코드

// Java 상속 - 4. this & super

class Cal111 {
	public int sum(int v1, int v2) {
		return v1+v2;
	}
	// this
	// 자기 자신을 뜻함
	public int sum(int v1, int v2, int v3) { // 같은 이름 메소드 // int v3 추가
		return this.sum(v1,v2)+v3;	// .sum() 자기자신
	}
}
class Cal333 extends Cal11{		// extends : Cal1을 상속
	public int minus(int v1, int v2) {
		return v1-v2;			// Cal3는 이제 부모 클래스가 없는 마이너스 기능도 탑재
	}
	
	// super
	// 부모를 뜻함
	public int sum(int v1, int v2) {
		System.out.println("Cal3!!");
		return super.sum(v1,v2);	// .sum()은 부모클래스 sum()
	}
}

public class Inheritance04 {
	public static void main(String[] args) {

		Cal111 c1 = new Cal111();
		System.out.println(c1.sum(2,1));
		System.out.println(c1.sum(2,1,1));
		
		Cal333 c3 = new Cal333();
		System.out.println(c3.sum(2,1));
		System.out.println(c3.minus(2,1));	// 자식클래스에 추가된 minus기능
		
	}
class Cal222 {
	public int sum(int v1, int v2) {
		return v1+v2;
	}
	public int minus(int v1, int v2) {
		return v1-v2;
	}
}
}
728x90
반응형
728x90

오버라이딩(Overriding)

부모가 가진 기능재정의(수정, 추가 등)하는 것을 오버라이딩(Overriding)

 

오버로딩(Overloading)

과적하다 의미. 상속과 관련x

부모클래스도 자식클래스도 오버로딩 가능. 자식 클래스는 부모 클래스를 오버라이딩, 오버로딩 둘 다 가능

자바는 형태만 다르면 같은 이름의 메소드같은 클래스 내에서도 여러개 사용 가능

ex)

class Cal11 {
	public int sum(int v1, int v2) {
		return v1+v2;
	}
	public int sum(int v1, int v2, int v3) { // 같은 이름 메소드 // int v3 추가
		return v1+v2+v3;
	}
}

 

 

전체코드

// Java 상속 - 2. 기능의 개선과 발전

class Cal11 {
	public int sum(int v1, int v2) {
		return v1+v2;
	}
	public int sum(int v1, int v2, int v3) { // 같은 이름 메소드 // int v3 추가
		return v1+v2+v3;
	}
}
class Cal33 extends Cal11{		// extends : Cal1을 상속
	public int minus(int v1, int v2) {
		return v1-v2;			// Cal3는 이제 부모 클래스가 없는 마이너스 기능도 탑재
	}
	public int sum(int v1, int v2) {
		System.out.println("Cal3!!");
		return v1+v2;
	}
}
public class Inheritance02 {

	public static void main(String[] args) {

		Cal11 c1 = new Cal11();
		System.out.println(c1.sum(2,1));
		System.out.println(c1.sum(2,1,1));
		
		Cal33 c3 = new Cal33();
		System.out.println(c3.sum(2,1));
		System.out.println(c3.minus(2,1));	// 자식클래스에 추가된 minus기능
		
		
	}
class Cal22 {
	public int sum(int v1, int v2) {
		return v1+v2;
	}
	public int minus(int v1, int v2) {
		return v1-v2;
	}
}
}
728x90
반응형
728x90

 

우리의 관심사

어떻게하면 자식 클래스가 부모 클래스가 가지고 있지 않은 새로운 기능을 추가할 것인가?

또 부모 클래스가 가지고 있는 기능을 덮어쓰기(수정) 할 것인가?

 

기능 추가

오리지널 Cal의 sum기능을 복사해서 Cal3에 넣고 minus로 변경

Cal3는 이제 부모 클래스가 없는 마이너스 기능도 탑재

 class Cal33 extends Cal11{		// extends : Cal1을 상속
	public int minus(int v1, int v2) {
		return v1-v2;			// Cal3는 이제 부모 클래스가 없는 마이너스 기능도 탑재
	}
}

Cal33 c3 = new Cal33();
System.out.println(c3.sum(2,1));
System.out.println(c3.minus(2,1));	// 자식클래스에 추가된 minus기능

오리지널의 기능 수정 가능?

가능

오리지널의 sum에 프린트기능 추가 수정해서 cal3에서 써보자

class Cal33 extends Cal11{		// extends : Cal1을 상속
	public int minus(int v1, int v2) {
		return v1-v2;			// Cal3는 이제 부모 클래스가 없는 마이너스 기능도 탑재
	}
	public int sum(int v1, int v2) {
		System.out.println("Cal3!!");
		return v1+v2;    // 부모가 가진 기능을 재정의(수정)
	}
}

오버라이딩(Overriding)

부모가 가진 기능재정의하는 것을 오버라이딩(Overriding)

 

 

전체코드

// Java 상속 - 2. 기능의 개선과 발전

class Cal11 {
	public int sum(int v1, int v2) {
		return v1+v2;
	}
}
class Cal33 extends Cal11{		// extends : Cal1을 상속
	public int minus(int v1, int v2) {
		return v1-v2;			// Cal3는 이제 부모 클래스가 없는 마이너스 기능도 탑재
	}
	public int sum(int v1, int v2) {
		System.out.println("Cal3!!");
		return v1+v2;
	}
}
public class Inheritance02 {

	public static void main(String[] args) {

		Cal11 c1 = new Cal11();
		System.out.println(c1.sum(2,1));
		
		Cal33 c3 = new Cal33();
		System.out.println(c3.sum(2,1));
		System.out.println(c3.minus(2,1));	// 자식클래스에 추가된 minus기능
		
		
	}
class Cal22 {
	public int sum(int v1, int v2) {
		return v1+v2;
	}
	public int minus(int v1, int v2) {
		return v1-v2;
	}
}
}

 

728x90
반응형
728x90

 

상속을 배우기 위해 계산기 클래스가 필요

class Cal {
	public int sum(int v1, int v2) {
		return v1+v2;
	}
}
public class Inheritance01 {

	public static void main(String[] args) {

		Cal c = new Cal();
		System.out.println(c.sum(2,1));		
	}

}

추가로 마이너스 기능을 넣고 싶다면?

일 잘하는 사람은 sum()메소드를 복사해서 새 클래스를 생성

class Cal1 {
	public int sum(int v1, int v2) {
		return v1+v2;
	}
}
class Cal2 {
	public int sum(int v1, int v2) {
		return v1+v2;
	}
	public int minus(int v1, int v2) {
		return v1-v2;
	}
}
public class Inheritance01 {

	public static void main(String[] args) {

		Cal1 c = new Cal1();
		System.out.println(c.sum(2,1));
		
		
		
	}

}

오리지널인 클래스 Cal1의 버그나 업데이트 했다고하면 오리지널과 같은 기능을 가지고 있는 Cal2 및 다른 여러 클래스들은 똑같이 반영이 안되기 때문에 일일히 수많은 코드를 수정해야한다

또한 같은 내용의 코드도 굉장히 많아질 것

코드가 1억줄이라면 각기 다른 클래스의 같은 내용의 메소드를 쉽게 알아보기가 매우 어려울 것

 -이때 우리가 유용하게 쓸 수 있는 것이 상속(Inheritance)

 

상속(Inheritance)이란?

어떤 클래스가 가지고 있는 변수메소드확장해서 상속해서 다른 클래스갖도록 하는 것

 

상속의 장점

  1. 코드의 재사용성up
  2. 유지보수 편의성 up
  3. 가독성 up
  4. 코드의 양 down

 

 

부모클래스(=superClass)

자식클래스(=subClass)

 

 

전체코드

// Java 상속 - 1. 수업소개 : 상속의 정의 & 장점

class Cal1 {
	public int sum(int v1, int v2) {
		return v1+v2;
	}
}
class Cal3 extends Cal1{		// extends : Cal1을 상속
	
}
public class Inheritance01 {
	public static void main(String[] args) {

		Cal1 c1 = new Cal1();
		System.out.println(c1.sum(2,1));
		
		Cal3 c3 = new Cal3();
		System.out.println(c3.sum(2,1));
		
		
	}
class Cal2 {
	public int sum(int v1, int v2) {
		return v1+v2;
	}
	public int minus(int v1, int v2) {
		return v1-v2;
	}
}
}
728x90
반응형
728x90

<클래스와 인스턴스 & 객체지향 이후 공부할 것>

  1. 상속(inheritance)
  2. 인터페이스(Interface)
  3. 패키지(package)

 

1.상속inheritance

class Parent{
		public void method1() {
			// ...
		}
}

Q.위에서 저 클래스를 직접 수정할 수 없거나 변경하지 말아야하는 상황에서 method2()를 추가하고 싶다면?

A.저 클래스 전체를 카피해서 이름 다른 클래스로 해서 method2()를 추가

이 방법은 class parent의 method1의 코드 개선, 버그 해결 등을 하게 되면 이 method1을 카피한 수많은 모든 코드를 다 수정해야함. 일 산더미...?

 

이 문제 개선을 위해 자바에서 제공하는 기능이 상속

extends를 붙여서 상속표시

class Child extends Parent{
		public void method2() {
				// ... 
		}
}

Child라는 클래스에는 실제로는 method1이 구현되어 있지 않지만, 상속 받았기에 class Parent에 있기에 class Child에서도 사용 가능해짐

 - class parent 코드가 수정되면, 동시에 다른 자식 클래스에도 다 같이 수정된다

 

 

2.인터페이스(Interface)

interface contract {
		public String method1(String param);
		public int method2(int param);
}

원래 인터페이스에는 메소드의 이름, 파라미터와 리턴값의 형식은 적으나 실제 내용은 적지 않는다

 

class Concreate1 implements Contract {

}

위 코드 의미

Concreate1 이라는 클래스Contract 라는 인터페이스에 적혀있는 메소드들의 형식을 구현했다 or 구현해야한다는 의미

이 상태로 Concreate1 클래스를 컴파일하면 컴파일조차 안된다

 - 규칙위반 때문

 - Contract에 적혀 있는 메소드들을 정의해야한다는 규칙을 어겼기 때문

 

implements에 contract를 적어놓게 되면 class Concreate1은 interface의 contract적혀있는 형태의 메소드구체적으로 구현해야하는 책임을 갖는다

class Concreate1 implements Contract{
		public String method1(String param) {
				return "foo";
		}
		public int method2(int param) {
				return 1;
		}
}
// 클래스 콘크리트1 안에 내용이 메소드1의 내용으로 채워짐

 

 

마찬가지로 class Concreate2

Concreate1Concreate2서로 다른 클래스이지만 확신할 수 있는 것은,

이 클래스들은 반드시 contract에 약속되어 있는 정의되어있는 형태의 멤버들을 구현하고 있을 것이라는 것. 일종의 무언의 약속

 

3.패키지(package)

클래스 이름은 같지만 기능이 다른 두 클래스가 존재할 수 있다

ex)서로 다른 디렉토리에 있는 경우, 한 컴퓨터 안에 같은 이름의 파일이 여러개 존재할 수 있는 것

 

클래스도 서로 다른 패키지에 묶여있으면 같은 이름의 클래스가 공존 가능

많아진 클래스정리정돈의 도구로써 사용되는 것이 패키지

패키지보다 더 큰 정리정돈의 도구는 자바에서는 없다

 

 

 

 

 

728x90
반응형
728x90

어떨 때에 인스턴스를 쓰는게 좋을까?

<클래스화를 계속 써야할 상황>

1)공급가액 파라미터가 한번 세팅이 되고나서 내부적 상태가 바뀌지 않고 getVAT(), Total() 같은메소드들로 부가가치세, 총액 같은 값만 받으면 되는 간단한 상태면 클래스 사용하면 된다

또는

2)내부적인 상태가 한번 세팅이되면 여러 작업들이 끝나고 그 다음에 새로운 내부적인 상태가 변화가 오는 케이스에서도 클래스를 인스턴스화 시킬 필요는 없다고 본다

 

<인스턴스화를 써야할 상황>

그런데 클래스의 상태가 계속 바뀌어야하는 상황이라면?

ex) 공급가액(vauleOfSupply) 1만 세팅에서 2만,3만 등 경우의수가 엄청나게 많아지고 계속 바꿔가면서 써야한다면?

(즉, 클래스의 상태가 계속 바뀌어야하는 상태일 때는?)

Accounting08_2.valueOfSupply = 10000.0;		
System.out.println("Value of supply : " + Accounting.valueOfSupply);
System.out.println("VAT : " + Accounting.getVAT());
System.out.println("Total : " + Accounting.getTotal());

Accounting08_2.valueOfSupply = 20000.0;		
System.out.println("VAT : " + Accounting.getVAT());

Accounting08_2.valueOfSupply = 50000.0;		
System.out.println("VAT : " + Accounting.getVAT());

Accounting08_2.valueOfSupply = 900.0;		
System.out.println("Total : " + Accounting.getTotal());

 

공급가액(vauleOfSupply)이 하나가 아닌 내부적으로 수십개의 값들이 있고 계속 바꿔야한다면 버그 발생 확률 고위험

하나의 클래스여러 상태에서 돌려써서 버그발생 확률이 높아지게 되는 것

이럴 때 인스턴스화

독립된 인스턴스기에 상태별로 인스턴스를 만들어서 분리시키고 개별맞춤으로 관리가능

 

 

인스턴스가 생성될 때, 인스턴스가 내부적으로 꼭 가져야될 값(valueOfSupply)을 생성자 레벨에서 강제하고 싶다면?

A.아래의 코드 추가 및 인스턴스 생생코드 new Accounting(생성자); 생성자 인자부분 채우기

// 생성자가 호출될 때 인자를 매개변수로 전달하고 싶기에 public accounting() {}에 valueOfSupply를 넣는다
public Accounting08_3(double valueOfSupply) { 
		this.valueOfSupply = valueOfSupply;
}
// 생성자 인자 넣기
Accounting08_3 a1 = new Accounting08_3(**10000.0**);
        a1.valueOfSupply = 10000.0;

public accounting() {} 구현해주면 된다

생성자가 호출될 때 인자를 매개변수로 전달하고 싶기에 public accounting() {}에 valueOfSupply를 넣어주고 this.valueOfSupply 추가

 

 

위의 코드 this.valueOfSupply와 = valueOfSupply;가 가리키는 곳은?

this 키워드

 

 

 

전체코드

// OOP 8.2. 활용 - 인스턴스화

// 클래스화 to 인스턴스화

 
//class Accounting08_2{		// 클래스화
//
//    public static double valueOfSupply;		
//    public static double vatRate = 0.1;		
//    public static double getVAT() {
//        return valueOfSupply * vatRate;
//    }
//    public static double getTotal() {
//        return valueOfSupply + getVAT();
//    }
//}
//					클래스화
//      ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
//					인스턴스화

class Accounting08_2{		// 인스턴스화
	// 인스턴스 소속, static 제거
	// static은 클래스소속이고 클래스가 인스턴스에 접근하면 에러나는건 어떤 인스턴스인지 모르기때문 a1?a2?
	public double valueOfSupply;		
	public static double vatRate = 0.1;	// 부가가치세는 어느 인스턴스나 10% 고정이기에 static설정이 유리	
	public double getVAT() {			// 인스턴스 만들 때마다 메모리 사용하지 않아도 되고, 
	    return valueOfSupply * vatRate; // vatRate파라미터는 얘 하나로 조절 가능해서 유지보수 용이
	}
	public double getTotal() {
	    return valueOfSupply + getVAT();
	}
}

public class OOP08_2 {
	public static void main(String[] args) {		

//        Accounting08_2.valueOfSupply = 10000.0;		
//        System.out.println("Value of supply : " + Accounting.valueOfSupply);
//        System.out.println("VAT : " + Accounting.getVAT());
//        System.out.println("Total : " + Accounting.getTotal());
//        
//        Accounting08_2.valueOfSupply = 20000.0;		
//        System.out.println("VAT : " + Accounting.getVAT());
//        
//        Accounting08_2.valueOfSupply = 50000.0;		
//        System.out.println("VAT : " + Accounting.getVAT());
//        
//        Accounting08_2.valueOfSupply = 900.0;		
//        System.out.println("Total : " + Accounting.getTotal());
    
				Accounting08_2 a1 = new Accounting08_2();
		    a1.valueOfSupply = 10000.0;
		    
		    Accounting08_2 a2 = new Accounting08_2();
		    a2.valueOfSupply = 20000.0;
		    
		    System.out.println("Value of supply : " + a1.valueOfSupply);
		    System.out.println("Value of supply : " + a2.valueOfSupply);
		    
		    System.out.println("VAT : " + a1.getVAT());
		    System.out.println("VAT : " + a2.getVAT());
		    
		    System.out.println("Total : " + a1.getTotal());
		    System.out.println("Total : " + a2.getTotal());    
	}
}
728x90
반응형

+ Recent posts