Data Scientist 옌

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

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

22-02-14(월) 013일차 [Java] 객체 지향 프로그래밍, 상속, 생성자, this, 정보 은닉

옌炎 2022. 4. 16. 14:34
728x90

수업내용


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

  • [교재 127, 351p] 객체 지향 프로그래밍
  • 지난 시간 복습
자바
----
자바로 개발할 때 필요한 도구
jdk(jre)
	javac.exe 컴파일러: 사람이 인지하는 코드로 작성해서 컴퓨터가 알아볼 수 있게 하는 것
		자바 소스를 자바의 규칙(키워드, 연산자, 문자, 식별자, 빌트인클래스 사용방법)에
		잘 맞게 작성했는지 검사해서 규칙을 잘 지켰으면
		jvm이 바이트코드를 만든다.
	java.exe
		jvm이 바이트코드를 cpu하고 통신해서 결과를 만드는 것

API
	rt.jar, src.jar : jdk 1.8 자바소스(클래스)가 8천여개 있다.
	static
	리턴형
	매개변수
cmd
	명령어 실행창
	패키지 컴파일 javac -d . 자바소스.java
	패키지 실행 java 패키지명.클래스이름
편집기
	자바 소스 편집

키워드 예약어 : 기능이 있는 영어 단어 : 자바 엔진에서 읽어서 일을 시키는 멸령어
----------
package
import
public
static
new
void
byte
char
short
int
long
float
double
if
else
for
while
do
break

연산자
----------
+ - * /
< > = && || !=
== : 숫자 비교하는 연산자

식별자
----------
클래스이름 : 영문자 대문자로 시작
함수이름: 영문자 소문자로 시작
변수이름: 영문자 소문자로 시작

빌트인 클래스
-----------
java.lang.String
	public char charAt(int index)
java.lang.System
	public static printStream out
java.util.Scanner
	public int nextInt()
java.io.printStream
java.lang.Byte
java.lang.Character
java.lang.Short
java.lang.Integer
java.lang.Long
java.lang.Float
java.lang.Double

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

  • 지난 시간 복습
변수
	자바 데이터 타입
	기초 자료형 -> 자바에서 사용하는 도구 중 유일하게 객체가 아니다.
				래퍼 클래스(Wrapper Class)의 상수로 존재한다.

		==========================
		int i = 값;
		int iV = 참조변수.함수() : static이 없고 리턴형이 있는 함수
		int iV1 = 클래스이름.함수(); : static이 있고 리턴형이 있는 함수
		int iV2 = 클래스이름.변수이름;
		==========================
		숫자
			정수
				byte
				short
				int long
			실수
				float
				double
		문자
				char
		논리
				boolean
	참조 자료형
		기초 자료형을 제외한 모든 것이다.
		데이터형 참조변수 = 주소값;
		어떤 자원은 주소값을 생략하고 값 또는 다른 것을 리턴해준다.
		String s = "abc";
		Date d = new new Date();
		int i[] = new int[3];
  • 객체 지향 프로그래밍
================================================================
객체 지향 프로그래밍 Object Oriented Programming
================================================================
자바는 미리 만들어진 프로그램 또는 클래스를 가지고
새로운 프로그램 또는 클래스를 만든 것이다.

빌트인 클래스 built-in class 미리 만들어 둔 클래스 API

================================================================
자바에서 빌트인 클래스의 최고 오두머리는 java.lang.Object 클래스이다.
사용자 정의 클래스는 빌트인 클래스를 가지고 만드는 것이다.
java.lang.Object 클래스를 상속해서 만든다.
================================================================

상속개념
인간 사회에서의 상속 개념
부모 자식에게 넘겨 주는 것
부모가 가지고 있는 재산을 자식에게 넘겨주는 것
일반적으로 부모가 더 부자이다.

객체 지향에서는
자식이 부모보다 더 부자이다.
자식은 부모의 재산을 다 사용할 수 있다.
단	부모가 자식에게 상속을 해주면
	부모는 자식의 재산을 부모 맘대로 사용할 수 없다.

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

  • 객체 지향 프로그래밍 (계속)
객체 지향에서의 상속
	자원을 사용하기 위해서
	부모의 자원을 자식이 사용하기 위해서
	고조부 > 증조부 > 조부 > 나 > 자식 > 손자 > 증손자
	고조부가 증조부의 자원을 사용하려면 증조부의 허락을 받아야 한다.

자바 프로그램을 구성하는 최소 단위
클래스 = 변수 + 함수
클래스에서 클래스에게 상속을 할 수 있다.
클래스에서 상속 관계를 가지면
부모 클래스, 자식 클래스가 성립된다.
상속을 해주는 클래스를 부모 클래스라 하고
상속을 받는 클래스를 자식 클래스라고 부른다.

자바에서 상속 기능을 하는 키워드는
	extends		클래스 상속할 때 사용하는 키워드
	implements	인터페이스를 상속할 때 사용하는 키워드
  • Exam_Object
package a.b.c.ch2;
/*
	자바에서 클래스를 만들면 (빌트인 클래스, 사용자 정의 클래스)
	무조건 java.lang.Object 클래스를 상속하게 되어있다.
	실제로 클래스를 구성할 때는 상속하는 구문을 생략한다.

	java.lang.Object 클래스는 자바에서 수퍼 클래스, 최고 조상 클래스라고 한다.
	생성자 1개
	함수 11개
	빌트인 클래스, 사용자 정의 클래스는 위의 자원을 사용할 수 있다.

	extends 키워드로 클래스를 상속하면
	상속해준 클래스가 메모리에 먼저 올라간다.

*/

public class Exam_Object extends java.lang.Object {

	public static void main(String args[]) {

		System.out.println("Java Hello ~~~ !!");

	} // end of main()

} // end of Exam_Object class

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

  • Exam_Object (계속)
package a.b.c.ch2;
/*
	자바에서 클래스를 만들면 (빌트인 클래스, 사용자 정의 클래스)
	무조건 java.lang.Object 클래스를 상속하게 되어있다.
	실제로 클래스를 구성할 때는 상속하는 구문을 생략한다.

	java.lang.Object 클래스는 자바에서 수퍼 클래스, 최고 조상 클래스라고 한다.
	생성자 1개
	함수 11개
	빌트인 클래스, 사용자 정의 클래스는 위의 자원을 사용할 수 있다.

	extends 키워드로 클래스를 상속하면
	상속해준 클래스가 메모리에 먼저 올라간다.

*/

// public class Exam_Object extends java.lang.Object {
public class Exma_Objedct {
	// java.lang.Object
	// public String toString()
	public String toString() {
		
		System.out.println("나는 Object 클래스에 있는 toString() 함수이다.");

		return "문자를 리턴한다.";
	}

	public static void main(String args[]) {

		System.out.println("Java Hello ~~~ !!");

		Exam_Object eo = new Exam_Object();
		System.out.println("eo 참조변수 주소값 >>> : " + eo);
		// System.out.println("eo.toString() 참조 변수 주소값 >>> : " + eo.toString());

	} // end of main()

} // end of Exam_Object class
  • 생성자
package a.b.c.ch2;

// 생성자 : Constructor
// 생성자의 모습
/*
	클래스이름 () {
	
	}
*/
// 생성자는 클래스를 메모리에 올릴 때 자바 버추얼 머신이 사용하는 함수로
// 자바 소스에 생성자의 코드 블록이 있으면 그 생성자를 사용하고
// 자바 소스에 생성자의 코드 블록이 없으면 jvm 생성자를 만들어서 사용한다.
public class Exam_Constructor {

	String s;
	int i;

	public static void main(String args[]) {
		
		System.out.println("Hello Java!!");

	}

}

/*
	C:\00.KOSMO108\10.JExam\ch2>javap a.b.c.ch2.Exam_Constructor
	Compiled from "Exam_Constructor.java"
	public class a.b.c.ch2.Exam_Constructor {
	  java.lang.String s;
	  int i;
	  ===========================================================
	  public a.b.c.ch2.Exam_Constructor(); : 기본 생성자, default Constructor
	  이것을 jvm이 생성해서 멤버 필드를 초기화한다.
	  ===========================================================
	  public static void main(java.lang.String[]);
	}
*/
  • Exam_Constructor_1
package a.b.c.ch2;

public class Exam_Constructor_1 {

	String s;
	int i;

	// 매개변수가 없는 기본 생성자
	Exam_Constructor_1() {
		System.out.println("난 매개변수가 없는 생성자이다.");
	}

	// 매개변수가 있는 생성자
	Exam_Constructor_1(String s) {
		System.out.println("난 매개변수가 있는 생성자이다.");
		System.out.println("Exam_Constructor_1(String s) >>> : " + s);
	}

	public static void main(String args[]) {
	
		System.out.println("Hello Java!!");

		Exam_Constructor_1 ec1 = new Exam_Constructor_1();
		Exam_Constructor_1 ec2 = new Exam_Constructor_1("난 문자열이다.");

	}
}

/*
	C:\00.KOSMO108\10.JExam\ch2>javap a.b.c.ch2.Exam_Constructor_1
	Compiled from "Exam_Constructor_1.java"
	public class a.b.c.ch2.Exam_Constructor_1 {
	  java.lang.String s;
	  int i;
	======================================================== 
	  a.b.c.ch2.Exam_Constructor_1();

	  소스 코드에 있는 매개변수 없는 생성자를 호출 한 것이다.
	  // 매개변수가 없는 기본 생성자
		Exam_Constructor_1() {
		
		}

	======================================================== 
	  public static void main(java.lang.String[]);
	}
*/

/*
	C:\00.KOSMO108\10.JExam\ch2>javap a.b.c.ch2.Exam_Constructor_1
	Compiled from "Exam_Constructor_1.java"
	public class a.b.c.ch2.Exam_Constructor_1 {
	  java.lang.String s;
	  int i;
	  a.b.c.ch2.Exam_Constructor_1();
	  a.b.c.ch2.Exam_Constructor_1(java.lang.String);
	  public static void main(java.lang.String[]);
	}
*/

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

  • 객체 지향 프로그래밍과 생성자
객체 지향 프로그래밍 Object Oriented Programming
Java
1. All Object
2. java.lang.Object 클래스가 루트이면서
   모든 클래스(빌트인 클래스, 사용자 정의 클래스)에게 상속되어 있다.
3. 클래스를 사용하려면 제일 먼저 생성자를 찾는다.
	(클래스를 인스턴스, 클래스를 상속하려면, 클래스를 메모리에 올리려면)
	생성자는 클래스를 사용하려고 할 때 제일 먼저 멤버 필드를 초기화한다.

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

  • 생성자 예제 설명
    • MemberVO
package a.b.c.ch2.vo;

// 회원가입 프로그램에서 회원정보를 나르는 클래스

public class MemberVO {

    public String mid;
    public String mpw;
    public String mname;
    public String mhp;
    public String maddr;

    public MemberVO() {
        System.out.println("mid >>> : " + mid);
        System.out.println("mpw >>> : " + mpw);
        System.out.println("mname >>> : " + mname);
        System.out.println("mhp >>> : " + mhp);
        System.out.println("maddr >>> : " + maddr);
    }

    public MemberVO(String mid, String mpw, String mname, String mhp, String maddr) {
        System.out.print("mid >>> : " + mid);
        System.out.print(" mpw >>> : " + mpw);
        System.out.print(" mname >>> : " + mname);
        System.out.print(" mhp >>> : " + mhp);
        System.out.print(" maddr >>> : " + maddr + "\n");
    }   
}
  • MemberScr
package a.b.c.ch2.scr;

// a.b.c.ch2.vo.MemberVO에 있는 클래스를
// a.b.c.ch2.scr.MemberScr 클래스에서 사용하려고 불러온다.

// 생성자를 만드는 규칙
// 클래스이름 () {}
/*
    1. 클래스 이름 선언 (내가 사용하려고 하는 클래스이름과 동일하게 선언한다.)
    2. () 소괄호에 매개변수를 사용할 수 있다.
    3. {} 블록에서 클래스를 인스턴스하면서 맨 먼저 해야할 함수(동작)을 선언한다.
    4. 생성자는 멤버변수를 초기화한다.
*/
import a.b.c.ch2.vo.MemberVO;

public class MemberScr {

    public static void main(String args[]) {

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

        MemberVO mvo_1 = new MemberVO("PSH", "PSH00", "홍길동", "010-2947-1111", "서울시 구로구");
        System.out.println("mvo_1 참조변수 주소값 >>> : " + mvo_1);
		System.out.println();

        MemberVO mvo_2 = new MemberVO("KB", "KB00", "국민", "010-7152-1111", "서울시 동작구");
        System.out.println("mvo_2 참조변수 주소값 >>> : " + mvo_2);
		System.out.println();

        for (int i=0; i < 10; i++) {
            MemberVO  mvo_3 = new MemberVO("AA_"+i, "AA00_"+i,"홍길동2_"+i,"010-_"+i,"서울시_"+i);
            System.out.println("mvo_3 참조변수 주소값 >>> : " + mvo_3);
			System.out.println();
        }
    }
}

/*
a.b.c.ch2.vo.MemberVO  클래스를 import 하지 않고 컴파일 했을 때 에러가 발생한다.
-----------------------------------------------------------------------
C:\00.KOSMO108\10.JExam\ch2>javac -d . MemberScr.java MemberVO.java
MemberScr.java:9: error: cannot find symbol
                MemberVO mvo = new MemberVO();
                ^
  symbol:   class MemberVO
  location: class MemberScr
MemberScr.java:9: error: cannot find symbol
                MemberVO mvo = new MemberVO();
                                   ^
  symbol:   class MemberVO
  location: class MemberScr
2 errors
*/

/*
C:\00.KOSMO108\10.JExam\ch2>javac -d . M*.java

C:\00.KOSMO108\10.JExam\ch2>javac -d . M*r.java M*O.java
*/

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

  • Exam_This
package a.b.c.ch2;

import java.util.Date;
import java.util.Calendar;

// this 키워드 : 자기 자신 클래스를 가리킨다. : Object를 사용하는 모든 언어, 스크립트가 동일하게 적용된다.
public class Exam_This {

	String s;
	int i;

	// 생성자
	Exam_This() {
		System.out.println("난 Exam_This 클래스의 매개변수 없는 기본 생성자이다.");
		System.out.println("this >>> : " + this.getClass().getName());
		System.out.println("this.s >>> : " + this.s);
		System.out.println("this.i >>> : " + this.i);
	}

	Exam_This(String ss) {
		System.out.println("난 Exam_This 클래스의 매개변수 String ss 가 있는 생성자이다.");		
		System.out.println("ss >>> : " + ss);
		System.out.println("this >>> : " + this.getClass().getName());
	}

	public static void main(String args[]) {
		
		Exam_This et = new Exam_This();
		System.out.println("et 참조변수 주소값 >>> : " + et);

		Exam_This et_1 = new Exam_This("홍길동");
		System.out.println("et_1 참조변수 주소값 >>> : " + et_1);

		// public final Class<?> getClass()
		System.out.println("et.getClass() >>> : " + et.getClass());
		/*
		C:\00.KOSMO108\10.JExam\ch2>javap a.b.c.ch2.Exam_This
		Compiled from "Exam_This.java"
		public class a.b.c.ch2.Exam_This {
		  public a.b.c.ch2.Exam_This();
		  public static void main(java.lang.String[]);
		}
		*/

		// 참조변수.getClass().getName()을 사용하면 참조변수의 클래스이름(풀네임, 네임스페이스)을 리턴한다.
		System.out.println("et.getClass().getName() >>> : " + et.getClass().getName());

		String str = "abc";
		System.out.println("str >>> : " + str);
		System.out.println("str.getClass().getName() >>> : " + str.getClass().getName());

		int iV[] = new int[]{1, 2};
		System.out.println("iV 참조변수 주소값 >>> : " + iV);
		System.out.println("iV.getClass().getName() >>> : " + iV.getClass().getName());

		int iV2[][] = new int[2][3];
		System.out.println("iV2 참조변수 주소값 >>> : " + iV2);
		System.out.println("iV2.getClass().getName() >>> : " + iV2.getClass().getName());

		Date d = new Date();
		System.out.println("d 참조변수 주소값 >>> : " + d);
		System.out.println("d.getClass().getName() >>> : " + d.getClass().getName());
	}
}

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

  • 정보 은닉
package a.b.c.ch2;

/*
	정보의 은닉화
	Java Encapsulation
	informatuon hiding
*/

class Exam_EncapVO{

	// information hiding
	// private 접근 제한자 Access Modifier 클래스 밖은 못나감
	private String sval;
	private int ival;

	public Exam_EncapVO() {
		System.out.println("Exam_EncapVO() ::: sval" + sval);		
		System.out.println("Exam_EncapVO() ::: ival" + ival);
		System.out.println("Exam_EncapVO() ::: this.sval" + this.sval);
		System.out.println("Exam_EncapVO() ::: this.ival" + this.ival);
	}

	// String sval = "홍길동";
	// int ival = 27;
	public Exam_EncapVO(String sval, int ival) {
		System.out.println("Exam_EncapVO(String sval, int ival) ::: sval >>> : " + sval);		
		System.out.println("Exam_EncapVO(String sval, int ival) ::: ival >>> : " + ival);
		System.out.println("Exam_EncapVO(String sval, int ival) ::: this.sval >>> : " + this.sval);
		System.out.println("Exam_EncapVO(String sval, int ival) ::: this.ival >>> : " + this.ival);

		this.sval = sval;
		this.ival = ival;
		System.out.println("Exam_EncapVO(String sval, int ival) ::: this.sval = sval >>> : " + this.sval);
		System.out.println("Exam_EncapVO(String sval, int ival) ::: this.ival = ival >>> : " + this.ival);
	}

	public void setSval(String sval) {
		this.sval = sval;
	}

	public String getSval() {
		return this.sval;
	}

	public void setIval(int ival) {
		this.ival = ival;
	}

	public int getIval() {
		return this.ival;
	}
}

public class Exam_Encapsulation {

	public static void main(String args[]) {

		Exam_EncapVO ee = new Exam_EncapVO();
		System.out.println("ee 참조변수 주소값 >>> : " + ee);
//		System.out.println("ee.sval >>> : " + ee.sval);
//		System.out.println("ee.ival >>> : " + ee.ival);
		System.out.println("ee.getSval >>> : " + ee.getSval());
		System.out.println("ee.getIval >>> : " + ee.getIval());

		Exam_EncapVO ee_1 = new Exam_EncapVO("홍길동", 27);
		System.out.println("ee_1 참조변수 주소값 >>> : " + ee_1);
		System.out.println("ee_1.getSval >>> : " + ee_1.getSval());
		System.out.println("ee_1.getIval >>> : " + ee_1.getIval());

		ee_1.setSval("국민");
		ee_1.setIval(23);
		System.out.println("ee_1.setSval('국민'); ===> ee_1.getSval() >>> : " + ee_1.getSval());
		System.out.println("ee_1.setIval(23); ===> ee_1.getIval() >>> : " + ee_1.getIval());

	}
}

Notes

  • 생성자는 멤버 클래스 초기화

728x90