국비학원/공부

20일차 java(8)

mikan- 2023. 7. 2. 23:56

# 메소드 오버로딩

public class VolTest {

	public static void main(String[] args) {
		System.out.println("설계한 대로 실행체크(단위테스트)");
		
		// 객체는 다르지만 공통적으로 사용하는 메소드는 같음(통일성 부여)
		TV t = new TV();
		Radio ra = new Radio();
		
		t.turnOn();
		ra.turnOn();
		
		t.volumUp(80);
		ra.volumUp(70);
		
		// 비슷한 기능을 가진 메소드 작성 -> 메소드명을 통일(오버로딩)의 확장판(모든 클래스 단위로 설계)
		
	}
}
/*
 *  자식인터페이스 extends 부모인터페이스
 *  자식클래스 extends 부모클래스
 *  자식클래스 implements 부모인터페이스1, 부모인터페이스2, .... 다중상속
 */
public class TV implements AdvanceVolum {
	
	private int VolLevel; // 볼륨의 크기
	
	// 다형성 : 메소드명은 같지만 실제 내용은 다르다 -> 기능이 다 다르다
	
	@Override
	public void turnOn() {
		// TODO Auto-generated method stub
		System.out.println("TV 음악프로그램을 turnOn-----");
		
	}
	
	@Override
	public void turnOff() {
		// TODO Auto-generated method stub
		System.out.println("TV 음악프로그램을 turnOff-----");
	}
	
	@Override
	public void volumUp(int level) {
		// TODO Auto-generated method stub
		VolLevel += level;
		System.out.println("TV 음악프로그램을 VolumUp을 " + level + "만큼 올림-----");
	}
	
	@Override
	public void volumDown(int level) {
		// TODO Auto-generated method stub
		VolLevel -= level;
		if (VolLevel < 0 ) {
			VolLevel = 0;
		}
		System.out.println("TV 음악프로그램을 VolumDown을 " + level + "만큼 내림-----");
	}
	
	// TV에만 있는 다른기능은 각자 개발자에게 맡김
	
	
	
}

// 자식 인터페이스명 extends 부모인터페이스명
public interface AdvanceVolum extends Volum {

	/*-
	 * 부모로부터 물려받은 추상메소드를 이미 가진 상태
	 * public void volumUp(int level);
	 * public void volumDown(int level);
	 */
	public void turnOn(); // 프로그램 전원 ON
	public void turnOff(); // 프로그램 전원 OFF

}

/*
 * interface : +전체 프로그램에 사용되는 모든 공통적인 기능(업무분석)을 가지고
 * 추상메소드를 선언
 * 누구나 접근이 가능하도록 public interface로 작성 
 */
public interface Volum {
	// 1. 볼륨을 올리기 -> 수정 -> 매개변수O 반환값X
		public void volumUp(int level);
	
	// 2. 볼륨을 내리기 -> 수정 -> 매개변수O 반환값X
		public void volumDown(int level);

	// 3, 4 turnOn turnOff
		
}
/*
 *  자식인터페이스 extends 부모인터페이스
 *  자식클래스 extends 부모클래스
 *  자식클래스 implements 부모인터페이스1, 부모인터페이스2, .... 다중상속
 */
public class Radio implements AdvanceVolum {
	
	private int VolLevel; // 볼륨의 크기
	
	// 다형성 : 메소드명은 같지만 실제 내용은 다르다 -> 기능이 다 다르다
	
	@Override
	public void turnOn() {
		// TODO Auto-generated method stub
		System.out.println("Radio 음악프로그램을 turnOn-----");
		
	}
	
	@Override
	public void turnOff() {
		// TODO Auto-generated method stub
		System.out.println("Radio 음악프로그램을 turnOff-----");
	}
	
	@Override
	public void volumUp(int level) {
		// TODO Auto-generated method stub
		VolLevel += level;
		System.out.println("Radio 음악프로그램을 VolumUp을 " + level + "만큼 올림-----");
	}
	
	@Override
	public void volumDown(int level) {
		// TODO Auto-generated method stub
		VolLevel -= level;
		if (VolLevel < 0 ) {
			VolLevel = 0;
		}
		System.out.println("Radio 음악프로그램을 VolumDown을 " + level + "만큼 내림-----");
	}
	
	// Radio 에만 있는 다른기능은 각자 개발자에게 맡김
	
	
	
}

 

# 인터페이스 상속관계

// 자식클래스명 extends 추상클래스 implements 인터페이스명.....
public class ShapeTest extends Shape implements Drawable {
	
	// public double res = 0.0;
	// print Area();
	@Override
	public void draw() {
		System.out.println("원을 그려서 원의 면적 구하기");
	}

	@Override
	public double area(int r) {
		// java.lang.Math.PI(정적상수)
		return (r * r * Math.PI);
	}
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("원의 반지름을 입력하세요.");
		int r = sc.nextInt();
		ShapeTest st = new ShapeTest();
		st.res = st.area(r);
		st.printArea(); // 저장된 면적을 출력
		
		sc.close();
	}

}



// 원의 면적을 구해서 출력시켜주는 역활(추상클래스) 설계 + 메소드 제공
public abstract class Shape {
							 // 직사각형, 원(소수점), 삼각형
	public double res = 0.0; // 모든 도형에서 공통으로 사용할 변수(면적)
	
	// 원
	public abstract double area(int r); // 추상메소드(원의 반지름)
	
	//직사각형
	// public abstract int area(int x, int y);
	
	// 공통의 기능을 일반메소드로 만들면 상속 받아서 바로 사용할수 있음
	public void printArea() {
		System.out.println("도형의 총 넓이 : " + res);
	}
}



// 도형을 그린다.(원, 삼각형, 직사각형의 면적을 구한다)
public interface Drawable {
	
	public void draw(); // v(Circle, Rectangle, ...)
	// public double area(int r); // 원의 면적
}

 

# final

class Parent {
	// 1. final + 멤버변수 or 지역변수 -> 상수화(변수의값 고정)(대문자로 사용)
	final int COUNT = 1; // 멤버변수 옆에 final을 붙이면 그 변수 값은 절대 변경 못함
						 // 관례로 final이 붙은 변수명은 대문자로 적음

	// 2. final + 메소드명 : 상속은 허용해주는데 오버라이딩 금지X
	// 메소드의 성격과 전혀 다른 내용으로 변경하면 안되는 경우
	public final void sum(int a, int b) {
		System.out.println("sum : " + (a + b));
	}
	
	// 3. final class명 : 상속금지 -> 내용을 변경하면 안되는 class에 부여(ex 시스템)
	// final class Parent {} -> public class FinalTest extends Parent (상속 불가능X)
}

public class FinalTest extends Parent {
	
	/*
	final 을 붙임으로써 오버라딩이 금지됨
	public void sum(int a, int b) {
		System.out.println("데이터 연습중");
	}
	*/
	
	// count = 1
	public static void main(String[] args) {
		Parent p = new Parent();
		FinalTest ft = new FinalTest();
		// p.count = 2;
		System.out.println("p.COUNT : " + p.COUNT);
		
		ft.sum(10, 10);
	}
}

 

# static method (정적메소드)

/*-
 * static(정적의)
 *  1. 정적멤버변수
 *  
 *  	멤버변수(인스턴스변수) : 클래스 내부에서 선언된 변수 -> 공유가 안됨X(독립적 저장)
 *  	정적멤버변수(클래스변수) : 모든 객체가 공유할 수 있도록 만들어진 변수
 *  						 형식) : 클래스명.정적멤버변수명 or 객체명.정적멤버변수명
 *  
 *  2. 정적메소드
 *  3. 초기화 블럭(static {범위})
 */

class Car {
	String color;	// c1.color("Red")
	String model;
	String owner; // 주문자
	
	// 차의 종류와 상관없이 차의 생산량의 합을 계산
	static int serialNumber; // static을 붙이면 공유가 됨(공유값)(ex. 단체가 사용할 프린터 1대)

	public Car(String color, String model, String owner) {
		super(); // class Car extends Object 때문에 super가 생성됨
		this.color = color;
		this.model = model;
		this.owner = owner;
		serialNumber++; // 공통적으로 모든 객체가 불러다 사용하고 싶을때(공유하고 싶을때)
	}
	
	public static int getNumber() {
		return serialNumber; // 정적메소드 내부에서는 멤버변수 사용이 안됨X
							 // this를 정적메소드 내부에서 사용할 수 없기 때문에 멤버변수 사용이 안됨X
	/*-
	 * public static String getNumber() {
	 * 		return color; // 사용이 안되는 이유는 color 앞에 this가 생략되어있는 상태(this때문에)때문
	 * 					  // static 붙은 변수만 사용 가능
	 * }
	 *              
	 */
	}
	// main() 보다 먼저 실행시킬 구분이 필요하다면 static 영역설정
	// 환경설정 -> DB연동
	static { // 초기화 블럭
		System.out.println("제일먼저 main() 보다 실행할 구문이 필요할때");
		System.out.println("DB접속을 먼저 가능하도록 설정하고 싶을때");
		System.out.println("1. static 정적변수 -> 2. main() 호출");
		System.out.println("3. 정적메소드 -> 4. 클래스 -> 순으로 메모리에 로딩");
	}
}

public class CarFactory {

	public static void main(String[] args) {
		
		Car c1 = new Car("Red", "SM5", "홍길동");
		Car c2 = new Car("Blue", "SONATA", "임꺽정");
		Car c3 = new Car("Pink", "morning", "홍길동2");
		System.out.println("차 생산량(객체명.정적변수) : " + Car.serialNumber);
		System.out.println("차 생산량(객체명.정적변수) : " + c2.serialNumber);
		System.out.println("차 생산량(객체명.정적변수) : " + Car.getNumber());
		System.out.println("차 생산량(객체명.정적변수) : " + c1.getNumber());
	}

}

'국비학원 > 공부' 카테고리의 다른 글

22일차 java(10)  (0) 2023.07.03
21일차 java(9)  (0) 2023.07.03
19일차 java(7)  (0) 2023.07.02
18일차 java(6)  (0) 2023.05.16
17일차 java(5)  (1) 2023.05.15