Data Scientist 옌

매일 발전하는 IT문제해결사

국비지원교육 (22.01-22.07)/강의노트

22-02-16(수) 015일차 [Java] 상속, 다형성, 상수, final

옌炎 2022. 4. 16. 15:09
728x90

수업내용


1교시 (09:30-10:20)

  • 지난 시간 복습
생성자 Constructor
------------------
1. 클래스 이름에 () 소괄호를 붙이고 {} 중괄호를 가지고 있는 함수이다.
2. 생성자는 클래스를 메모리에 올릴 때(new 인스턴스, 상속 inheritance)
   ========================================
   해당 객체에 있는 멤버 변수를 초기화한다.
   ========================================
3. 생성자는 일반 함수의 오버로딩처럼 생성자 오버로딩을 할 수 있다.
4. 생성자 안에서 사용하는 this, super 키워드, this(), super() 함수를 사용할 수 있다.
   this 키워드, this() 함수는 자기자신 클래스에서 사용한다.
   super 키워드, super() 함수는 상속 관계에서 부모 클래스에 있는 자원 및 생성자를 호출할 때 사용한다.
================================================
5. 생성자를 호출할 때는 매개변수가 같은 것을 호출해야 한다.
================================================
6. default Constructor 소스 코드에 매개 변수가 업슨 생성자를 구현하지 않으면
   자바 버추얼 머신이 만들어주는 기본 생성자

상속 inheritance
------------------
클래스 종류
일반 클래스	public class 클래스이름{함수이름(){}}
추상 클래스	public abstract 클래스이름{abstract 함수이름();}
인터페이스 클래스 public interface 인터페이스클래스이름{함수이름();}

상속하는 이유
	클래스의 자원을 사용하려고 / 부모의 자원을 사용하려고
	상속당한 자손 클래스가 가장 부자이다. 자원을 제일 많이 사용할 수 있다.
	함수 오버라이딩을 할 수 있다. : 부모 클래스에 있는 함수를 자식 클래스로 옮겨 와서 사용하는 것
							  이떄 꼭 @Override를 사용해야 한다.
	클래스의 자원을 사용하는 방법(클래스를 메모리에 올리는 방법)
		static, new, extends, implements

extends : 클래스 상속을 하는 단일 상속 키워드
implements : 클래스에서 인터페이스를 다중 상속할 수 있는 키워드
			 단 : 인터페이스와 인터페이스의 상속은 extends 키워드를 사용한다.

2교시 (10:30-11:20)

  • Exam_Inherit_2
package a.b.c.ch2;

 class Class_부모 extends java.lang.Object{
 
 	Class_부모() {
		System.out.println("Class_부모() 생성자 >>> : ");
	}

	void 부모_1() {
		System.out.println("Class_부모().부모_1() 함수 >>> : ");
	}
 }

 class Class_자식 extends Class_부모 {
	
	Class_자식() {
		System.out.println("Class_자식() 생성자 >>> : ");
	}

	void 자식_1() {
		System.out.println("Class_자식().자식_1() 함수 >>> : ");
	}
 }

public class Exam_Inherit_2 {

	void examIn() {
		System.out.println("Exam_Inherit_2.examIn() 함수 >>> : ");
	}

	public static void main(String args[]) {
		
		Exam_Inherit_2 ei2 = new Exam_Inherit_2();
		// System.out.println("ei2 참조변수 >>. : " + ei2);
		// ei2.examIn();

		/*
			클래스(자원)을 사용하려고 상속관계에 있는 클래스를 인스턴스했다.
			객체지향 프로그래밍에서는 2번을 사용해야 한다.
			1. 자식클래스 참조변수 = new 자식클래스();
			2. 부모클래스 참조변수 = new 자식클래스();

			3, 4번은 사용하지 않는다.
			3. 부모클래스 참조변수 = new 부모클래스();
			4. 자식클래스 참조변수 = new 부모클래스();
		*/

		// 자식클래스 자식클래스_참조변수 = new 자식클래스();
		// 자식클래스_참조변수로 자식 클래스에 있는 자원 및 부모 클래스에 있는 자원을 사용할 수 있다.
		Class_자식 자식_1 = new Class_자식();
		System.out.println("자식_1 참조변수 주소값 >>> : " + 자식_1);
		자식_1.자식_1();
		자식_1.부모_1();
		System.out.println();

		// 부모클래스 부모클래스_참조변수 = new 자식클래스();
		// 부모클래스_참조변수로는 자기자신 클래스의 자원만 사용이 가능하다.
		Class_부모 부모_1 = new Class_자식();
		System.out.println("부모_1 참조변수 주소값 >>> : " + 부모_1);
		부모_1.부모_1();
		// 부모_1.자식_1();
		// 부모클래스_참조변수로 자식클래스의 자원을 사용하려면
		// 부모클래스_참조변수를 자식클래스로 형변환(캐스팅)을 해야 한다.
		System.out.println();

		// 자식클래스를 선언해서 부모클래스_참조변수를 형변환해서 사용한다.
		// 1)
		Class_자식 자식_2 = (Class_자식)부모_1;
		자식_2.자식_1();

		// 2)
		Object obj = 부모_1;
		Object obj_1 = obj;
		Class_자식 자식_3 = (Class_자식)obj_1;
		자식_3.자식_1();

		// 3)
		Object obj_2 = (Object)부모_1;
		Class_자식 자식_4 = (Class_자식)obj_2;
		자식_4.자식_1();
	
		// 4) 2번과 같음
		Object obj_3 = 부모_1;
		Class_자식 자식_5 = (Class_자식)obj_3;
		자식_5.자식_1();
	}
}

3교시 (11:30-12:20)

  • 상속 코드보면서 설명
    • 부모클래스에게 자식 클래스가 1개만 있는 것이 아닌데 extends로 상속할 때는 1개만 상속함
    • 나중에 다중 상속하나, 다중 상속 문법이 단일 상속과 같음

4교시 (12:30-13:20)

  • 추상 클래스 - 다형성
    • Exam_Abstract
package a.b.c.ch2;

// 추상 키워드 : abstract

// 추상 클래스
// 추상 클래스 = 변수 + 추상함수 + 일반함수
abstract class Class_Abstract_2 {

	abstract int add();
	abstract String eat();

	int add_1() {
		return 1;
	}
}

class Class_Abstract_1 extends Class_Abstract_2 {

	int add() {
		return 1 + 2;
	}

	String eat() {
		return "Class_Abstract_1.eat() >>> : ";
	}
}

public class Exam_Abstract {

	public static void main(String args[]) {

		Exam_Abstract ea = new Exam_Abstract();
		System.out.println("ea 참조변수 주소값 >>> : " + ea)

		Class_Abstract_1 ca1 = new Class_Abstract_1();
		int add = ca1.add();
		System.out.println();
	
	}
}

5교시 (14:30-15:20)

  • [교재 232~233p] 상속, [교재 249p] 한 걸음 더
  • [교재 259p] 다형성, [교재 261p] 그림
  • [교재 281~287p] 추상 클래스

6교시 (15:30-16:20)

  • A_computer
package a.b.c.ch2;

public abstract class A_Computer {

	public abstract void display();
	public abstract void typing();

	public void turnOn() {
		System.out.println("전원을 켭니다.");
	}

	public void turnOff() {
		System.out.println("전원을 끕니다.");
	}
}
  • A_DeskTop
package a.b.c.ch2;

public class A_DeskTop extends A_Computer {

	@Override
	public void display() {
		System.out.println("DeskTop display()");
	}

	@Override
	public void typing() {
		System.out.println("DeskTop typing()");
	}
}
  • A_Notebook
package a.b.c.ch2;

public abstract class A_NoteBook extends A_Computer {

	@Override
	public void display() {
		System.out.println("NoteBook display()");
	}
}
  • A_MyNoteBook
package a.b.c.ch2;

public class A_MyNoteBook extends A_NoteBook {
	
	@Override
	public void typing() {
		System.out.println("MyNoteBook typing()");
	}
}
  • A_ComputerTest
package a.b.c.ch2.abc;

import a.b.c.ch2.A_DeskTop;
import a.b.c.ch2.A_MyNoteBook;

public class A_ComputerTest {

	public static void main(String args[]) {
	
		A_DeskTop ad = new A_DeskTop();
		ad.display();
		ad.turnOn();
		ad.turnOff();

		A_MyNoteBook am = new A_MyNoteBook();
		am.display();
		am.typing();
		am.turnOn();
		am.turnOff();
	}
}
  • 위 코드 뭉치(A_computer ⇒ A_DeskTop, A_Notebook ⇒ A_MyNoteBook)을 상속 받은 A_ComputerTest실행
  • javac -d . A*r.java A*p.java A*k.java A*M*k.java A*t.java java a.b.c.ch2.abc.A_ComputerTest
  • [교재 61p] 상수와 리터럴

7교시 (16:30-17:20)

  • Exam_Constant
package a.b.c.ch2.common;

public abstract class Exam_Constant {

	// 상수 Constant :: 변하지 않는 값 :: 변경하면 안되는 값
	/*
		1. 변경하면 안되는 값
		2. 상수는 클래스가 로드할 때 맨 먼저 메모리에 로드된다. (상수 풀, Constant Pool)
		3. 상수는 클래스 블록 맨 위에 작성한다.
		4. 가능한 웬만하면 상수로 만들어서 사용한다.
	*/

	// 업로드
	public static final String FILE_UPLOAD_PATH = "C:\\00.KOSMO108\\30.Web\\fileUpload";
	public static final String IMG_UPLOAD_PATH = "C:/00.KOSMO108/30.Web/imgUpload";
	public static final int FILE_UPLOAD_SIZE = 10 * 1024 * 1024; // 10메가 
	public static final int IMG_UPLOAD_SIZE = 10 * 1024 * 1024; // 10메가 

	// JDBC 연결
	public static final String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver";
	public static final String JDBC_URL = "jdbc:oracle:thin:@localhost:1521:orclHBE00";
	public static final String JDBC_USER = "scott";
	public static final String JDBC_PWD = "tiger";
}
  • Exam_Constant_Test
package a.b.c.ch2;

import a.b.c.ch2.common.Exam_Constant;

public class Exam_Constant_Test {
	
	public static void main(String args[]) {
		
		// Exam_Constant ec = new Exam_Constant();
		/*
			C:\00.KOSMO108\10.JExam\ch2>javac -d . Exam_*_Test.java Exam_Constant.java
			Exam_Constant_Test.java:9: error: Exam_Constant is abstract; cannot be instantiated
							Exam_Constant ec = new Exam_Constant();
										   ^
			1 error	
		*/

		String fileUploadPath = Exam_Constant.FILE_UPLOAD_PATH;
		System.out.println("fileUploadPath >>> : " + fileUploadPath);
	}

}
  • Exam_Constant_Test에서 Exam_Constant의 상수를 import해와서 사용
javac -d . Exam_Constant*.java
java a.b.c.ch2.Exam_Constant_Test
  • Exam_Constant_Test_1
package a.b.c.ch2;

import a.b.c.ch2.common.Exam_Constant;

public class Exam_Constant_Test_1 extends Exam_Constant {

	public static void main(String args[]) {

		String fileUploadPath = Exam_Constant.FILE_UPLOAD_PATH;
		String imgUploadPath = Exam_Constant.IMG_UPLOAD_PATH;
		int fileUploadSize = Exam_Constant.FILE_UPLOAD_SIZE;
		int imgUploadSize = Exam_Constant.IMG_UPLOAD_SIZE;
		System.out.println("fileUploadPath	>>> : " + fileUploadPath);
		System.out.println("imgUploadPath	>>> : " + imgUploadPath);
		System.out.println("fileUploadSize	>>> : " + fileUploadSize);
		System.out.println("imgUploadSize	>>> : " + imgUploadSize);

		String jdbc_driver = Exam_Constant.JDBC_DRIVER;
		String jdbc_url = Exam_Constant.JDBC_URL;
		String jdbc_user = Exam_Constant.JDBC_USER;
		String jdbc_pwd = Exam_Constant.JDBC_PWD;
		System.out.println("jdbc_driver	>>> : " + jdbc_driver);
		System.out.println("jdbc_url	>>> : " + jdbc_url);
		System.out.println("jdbc_user	>>> : " + jdbc_user);
		System.out.println("jdbc_pwd	>>> : " + jdbc_pwd);
	}
}
  • [교재 305p] final
    • 자바 1.8에서는 final 변수는 변경 불가하나 1.4는 가능함
    • Exam_Final
package a.b.c.ch2;

public class Exam_Final {
	
	public static final String FILE_UPLOAD_PATH = "C:\\00.KOSMO108\\30.Web\\fileUpload";

	void examMethod(final String s) {
		// 매개변수에 final
		// s = "홍길동";
		String ss = s;
		System.out.println("ss >>> : " + ss);
	}

	public static void main(String args[]) {
		
		// 변수에 final
		// Exam_Final.FILE_UPLOAD_PATH = "11";
		

		String s = Exam_Final.FILE_UPLOAD_PATH;
		System.out.println("s >>> : " + s);

		Exam_Final ef = new Exam_Final();
		ef.examMethod("홍길동1");
	}
}

8교시 (17:30-18:30)

  • [교재 61 ~ 63p] 리터럴
  • [교재 314p] 인터페이스
  • Exam_Interface
package a.b.c.ch2;

class Interface_B_Impl implements Interface_B {

	public void inter_b() {
		System.out.println("Interface_B_Impl.inter_b() 함수 실행");
	}
}

interface Interface_B {

	public void inter_b();
}

class Interface_a_Impl implements Interface_A {

	public void inter_a() {
		System.out.println("Interface_a_Impl.inter_a() 함수 실행");
	}
}

interface Interface_A {

	public void inter_a();
}

public class Exam_Interface {

	public static void main(String args[]) {
		
		// 부모_인터페이스클래스 선언 참조변수 = new 자식클래스();
		// 이렇게 사용하면 돌아가긴 하나 전기를 많이 잡아먹음. 사용하지 말 것.
		Interface_A ia = new Interface_a_Impl();
		ia.inter_a();

		// 자식_인터페이스클래스 선언 참조변수 = new 자식클래스();
		// 옳은 방법
		Interface_a_Impl iai = new Interface_a_Impl();
		iai.inter_a();

	}
}

Notes

  • 책보고 주소값으로 공부

728x90