객체지향 프로그램 기법

준동이·2023년 3월 17일
0

퀴즈

11시 10분 - 퀴즈
hrd에 업로드
1. 퀴즈(7문제) - 단답형
자바스크립트에서 나옴
1-1. 자바스크립트 해석엔진(개념)
1-2. 자료 - 변수,상수 선언법
1-3. 함수 - 선언, 사용
1-4. 배열 - 선언, 사용
2. 자기소개 - 캡처화면(1장)

객체 구성 문법 (한 개 클래스간 문법)

접근제어자 class 클래스명 {
				멤버필드
                접근제어자 자료형 객체변수명;
                메서드
                접근제어자 리턴형(없으면void) 메서드명() {
                }
                
                * 인스턴스 / 클래스(static)
                * 특별 메서드
                		main
                        생성자
                * 오버로딩
                * 가변인자
}

객체지향프로그램 기법(여러개 클래스간 문법)

캡슐화(은닉화)

접근제어자
setter / getter

상속

extends로 상속 구현 ex) A(자식) extends B(부모)
추상
다형

상속

공통내용의 모듈화
단일 상속이 기본(편법)

조상 Object

extends라는 상속구문이 없다면 컴파일러가 무조건 Object 상속 받음
ex) class A {} <- Object클래스 상속받고있음.

상속받은 값 출력하기

// Object 클래스 상속받고있음(아무것도 상속받고있지 않는 클래스는 Object클래스를 상속받음)
class Parent {
    void viewParent() {
        System.out.println("viewParent 호출");
    }
}

class Child extends Parent {
    void viewChild() {
        System.out.println("viewChild 호출");
    }
}

public class InheritanceEx02 {
    public static void main(String[] args) {
        Child c = new Child();
        c.viewChild();
        c.viewParent();
        System.out.println(c.toString());

        Parent p = new Parent();
        p.viewParent();

        // Object에서 상속받은 toString(); 
        System.out.println(p.toString());
    }
}




참조변수 값 뽑기

다 같은 주소값이 나온다 (독립적 요소가 아님)

class Parent {
    void viewParent() {
        System.out.println("viewParent 호출 : " + this);
    }
}

class Child extends Parent {
    void viewChild() {
        System.out.println("viewChild 호출 : " + this);
    }
}


public class InheritanceEx03 {
    public static void main(String[] args) {
        Child c = new Child();
        System.out.println(c);
        c.viewChild();
        c.viewParent();
    }
}




부모의 부모것도 상속이 된다.

class Parent {
    void viewParent() {
        System.out.println("viewParent 호출 : " + this);
    }
}

class Child extends Parent {
    void viewChild() {
        System.out.println("viewChild 호출 : " + this);
    }
}

class GrandChild extends Child {
    void viewGrandChild() {
        System.out.println("viewGrandChild 호출 : " + this);
    }
}

public class InheritanceEx04 {
    public static void main(String[] args) {
        GrandChild gc = new GrandChild();
        gc.viewGrandChild();
        gc.viewChild();
        gc.viewParent();
    }
}




접근제어자는 상속에도 영향을 미친다.

private은 개인적인것으로 간주하여 상속받아도 사용이 불가능하다.

class Parent {
    private String p1 = "홍길동";
    public String p2 = "박문수";
    String p3 = "이몽룡";
    void viewParent() {
        System.out.println("viewParent 호출 : " + this);
    }
}

class Child extends Parent {
    void viewChild() {
        System.out.println("viewChild 호출 : " + this);

        System.out.println(p1);
        System.out.println(p2);
        System.out.println(p3);
    }
}

class GrandChild extends Child {
    void viewGrandChild() {
        System.out.println("viewGrandChild 호출 : " + this);
    }
}

public class InheritanceEx04 {
    public static void main(String[] args) {
        GrandChild gc = new GrandChild();
        gc.viewGrandChild();
        gc.viewChild();
        gc.viewParent();
    }
}



class Parent {
    private String p1 = "홍길동";
    public String p2 = "박문수";
    String p3 = "이몽룡";
    void viewParent() {
        System.out.println("viewParent 호출 : " + this);
    }
}

class Child extends Parent {
    void viewChild() {
        System.out.println("viewChild 호출 : " + this);

        // System.out.println(p1);
        System.out.println(p2);
        System.out.println(p3);
    }
}

class GrandChild extends Child {
    void viewGrandChild() {
        System.out.println("viewGrandChild 호출 : " + this);
    }
}

public class InheritanceEx04 {
    public static void main(String[] args) {
        GrandChild gc = new GrandChild();
        gc.viewGrandChild();
        gc.viewChild();
        gc.viewParent();

        Child c = new Child();
        System.out.println(c.p1);
        System.out.println(c.p2);
        System.out.println(c.p3);
    }
}




메서드 재정의(오버라이딩)

조상 클래스에 정의된 기능을 자식 클래스에 적합하게 수정해서 재정의하는 것을 메서드 오버라이딩(overriding : 재정의) 라고 한다.

원래는 같은 이름의 메서드는 두 개 이상 쓸수없는것이 원칙 / 그렇지만 오버라이딩으로 원칙 뿌심

오버로딩과는 헷갈리면 안됨

오버라이딩 5개의 규칙

  • 상속관계에서
  1. 메서드 이름은 조상 클래스의 메서드 이름과 같아야 한다.
  2. 매개변수의 개수, 타입, 순서는 조상 클래스의 메서드와 같아야한다.
  3. 리턴 타입은 조상 클래스의 메서드와 같아야 한다.
  4. 접근 제한자는 조상 클래스의 메서드보다 범위가 같거나 넓어야 한다.
  5. 조상 클래스의 메서드보다 더 상위의 예외를 던질 수는 없다.

오버라이딩에서 매개변수가 부모와 자식이 다르면, 호출할때 호출값과 맞는것으로 출력이 된다.

class Parent {

    void viewParent() {
        System.out.println("viewParent 호출 : " + this);
    }
}

class Child extends Parent {
    void viewParent(int a) {
        System.out.println("ChildviewParent 호출 : " + this);
    }
}

class GrandChild extends Child {
    void viewGrandChild() {
        System.out.println("viewGrandChild 호출 : " + this);
    }
}


public class OverridingEx01 {
    public static void main(String[] args) {
        Child c = new Child();

        // 매개변수가 있기때문에 부모것으로 출력한다
        c.viewParent();

        // 자신의 메서드 출력
        c.viewParent(10);
    }
}



메서드 이름은 같지만 반환타입이 다를때는 에러가 난다

class Parent {

    void viewParent() {
        System.out.println("viewParent 호출 : " + this);
    }
}

class Child extends Parent {
    // 이름은 같지만 반환타입이 달라서 에러
    int viewParent() {
        System.out.println("ChildviewParent 호출 : " + this);
        return 10;
    }
}

class GrandChild extends Child {
    void viewGrandChild() {
        System.out.println("viewGrandChild 호출 : " + this);
    }
}


public class OverridingEx01 {
    public static void main(String[] args) {
        Child c = new Child();

        // 매개변수가 있기때문에 부모것으로 출력한다
        c.viewParent();

        // 자신의 메서드 출력
        c.viewParent(10);
    }
}



super - 조상의 멤버를 참조

class Parent {
    String p = "홍길동";
    void viewParent() {
        System.out.println("viewParent 호출 : " + this);
    }
}

class Child extends Parent {
    String p ="박문수";
    void viewParent() {
        System.out.println("ChildviewParent 호출 : " + this);
        
        // super
        super.viewParent();
        System.out.println(p);
        System.out.println(this.p);
        System.out.println(super.p);
    }
}

class GrandChild extends Child {
    void viewGrandChild() {
        System.out.println("viewGrandChild 호출 : " + this);
    }
}

public class OverridingEx02 {
    public static void main(String[] args) {
        Child c =new Child();
        c.viewParent();
    }
}


상속관계의 Constructor

class Parent {
    Parent() {
        System.out.println("Parent 생성자 호출");
    }
}

class Child extends Parent {
   Child() {
    System.out.println("Child 생성자 호출");
   }
}

public class ConstructorEx04 {
    public static void main(String[] args) {
        Child c = new Child();
    }
}



super()

부모가 기본 생성자가 아닌 매개변수가 있거나 하는 다른 생성자일 경우에는 super()로 찾아줘야한다.
this()와 같은 기능 대신 super()는 조상클래스에 사용
제일 첫 줄에 적어줘야한다.

class Parent {
    // Parent() {
    //     System.out.println("Parent 생성자 호출");
    // }

    Parent(String data) {
        System.out.println("Parent(String data) 생성자 호출");
    }
}

class Child extends Parent {
   Child() {
        // Parent("10"); 이거로 부모 생성자 못가져옴
        super("10");
    System.out.println("Child 생성자 호출");
   }
}

public class ConstructorEx04 {
    public static void main(String[] args) {
        Child c = new Child();
    }
}



final

final이 붙은 클래스는 상속 불가능.

final 종류

final 클래스 - 상속 불가
final 메서드 - 재정의(오버라이딩) 불가
final 변수 - 값 변경 불가
상수는 final static 형식으로 많이 쓰임

final 클래스는 다른 클래스가 상속하지 못하게한다.

final class Parent {
    Parent() {
        System.out.println("Parent 생성자 호출");
    }
}

// 부모가 final이기때문에 상속이 불가능하다. / 에러 발생.
class Child extends Parent {
    Child() {
        System.out.println("Child 생성자 호출");
    }
}

public class Hello {
    public static void main(String[] args) {
        Child c = new Child();
    }
}



final 메서드는 오버라이딩을 못하게 한다.

class Parent {
    Parent() {
        System.out.println("Parent 생성자 호출");
    }
	
    // 다른 클래스에서 오버라이딩 못하게 한다.
    final void viewParent() {
        System.out.println("Parent viewParent 호출");
    }
}

class Child extends Parent {
    Child() {
        System.out.println("Child 생성자 호출");
    }

	// 부모클래스의 viewParent()는 final 메서드여서 오버라이딩 못한다.
    void viewParent() {
        System.out.println("Child viewParent 호출");
    }
}

public class Hello {
    public static void main(String[] args) {
        Child c = new Child();
        c.viewParent();
    }
}



다형성

다형성 - 클래스 형변환
부모 타입 변수로 여러 자식 객체들을 호출하고 싶을 때 사용
1. 상속 관계에서 형변환 가능
자식 -> 부모 = 자동형변환
부모 -> 자식 = 강제 형변환 / (자식)부모

다형성 예재

class Parent {
    void viewParent() {
        System.out.println("Parent 호출");
    }
}

class Child extends Parent {
    void viewParent() {
        System.out.println("Child 호출");
    }
}

class Child2 extends Parent {
    void viewParent() {
        System.out.println("Child2 호출");
    }
}

public class Hello {
    public static void main(String[] args) {
        // Child c = new Child();
        // c.viewParent();

        // Child2 c2 = new Child2();
        // c2.viewParent();

        Parent p = new Child();
        p.viewParent();

        p = new Child2();
        p.viewParent();
        
    }
}




패키지(Package)

클래스를 보관하기 위한 폴더.
Package이름 - 도메인 형식(회사 도메인)으로 작성.
Ex) package com.naver.www << 반대로 작성
같은 클래스 이름이라도 패키지가 다르면 사용 가능.

컴파일 방법 - 기존 것에서 -d . 추가

javac -d . -encoding utf-8 packB.java (폴더 만들어지고 안에 packb.class가 들어감)

jdk 10 버전 이하

{
	패키지
  	클래스
  ...
}  

jdk 10 버전 이상

{
	모듈 (현업에서는 아직 잘 사용하지는 않음)
    패키지
    클래스
    ...
}

Package 선언

// 클래스를 이 패키지명을 통해 안에 넣는다.
package 패키지명 

class 클래스명 {
}

import 패키지명.클래스명

패키지 안의 클래스를 가져오는 기능
패키지에 모든 클래스를 포함할 때는 '*' 사용
다른 패키지에 선언된 클래스들 사용 가능

Package 선언, 생성 후 사용해보기

package1 폴더는 패키지만 다뤄보기 위해 새로 만든 폴더

"package 패키지명;" 후 컴파일 해주면 패키지 안에 클래스명.class가 생성이 된다.

// pack2를 선언하면 후 컴파일 해주면 pack의 packC.class 파일이 패키지 pack2 안에 생성이 된다.
package pack2;

// 같은 패키지의 다른 클래스에서 사용 할 수 있게 접근제어자 public으로 선언
public class packC {
    public packC() {
        System.out.println("packC 생성자 호출");
    }
}

컴파일



컴파일 후 생성된 패키지


packMain이라는 클래스 파일을 만들어 같은 패키지 안에 있는 packC클래스 호출

패키지명.클래스명 변수 = new 패키지면.클래스명(); // 이런 방식으로 호출



호출결과




"import 패키지명.클래스명;" - 패키지 안의 클래스 가져오기

결과



패키지명 정해지지않은 클래스파일 호출하기


#### 호출

profile
개발자 꿈나무

0개의 댓글