다형성

- 다형적 참조의 핵심은 부모는 자식을 품을 수 있다는 것이다.
- 하나의 변수 타입으로 다양한 자식 인스턴스를 참조할 수 있다.
- 다형적 참조시 오버라이딩 된 메서드가 항상 우선권을 가진다.

업캐스팅

- 자식 클래스 타입에서 부모 클래스 타입으로 형 변환
- 자식 인스턴스를 생성하면 부모도 같이 생성되기 때문에 업캐스팅시 문제가 발생하지 않는다.
- 그래서 업캐스팅 사용시 생략이 가능하다.

다운캐스팅

- 부모 클래스에서 자식 클래스 타입으로 형 변환
- 부모 인스턴스를 생성시 하위 자식은 생성되지 않기때문에 문제가 발생한다.
- 다운캐스팅 사용시 생략할 수 없다.

 

Child child = new Child();

// 업캐스팅
Parent parent = (Parents) child;
Parent parent = child; // 업캐스팅시 () 생략 권장

// 다운캐스팅
Child child1 = (Child) parent;

 

추상 클래스

- 추상 클래스를 선언할때 abstract 키워드를 붙여주면 된다.
- 추상 클래스는 직접 인스턴스 생성을 못한다.
  ex) AbstractA abstract = new AbstractA() -> 불가능
- 추상 클래스는 일반 클래스와 동일하게 생성자, 인스턴스 멤버변수, 메서드 선언이 가능하다.

 

추상 메서드

- 추상메서드가 하나라도 있는 클래스는 추상 클래스로 선언해야 한다.
- 추상 메서드는 상속 받은 자식 클래스에서 반드시 오버라이딩 해서 사용해야 한다.

 

추상클래스는 인스턴스 생성을 못하는 이유

- 동작이 정의되어 있지 않은 추상 메서드를 포함하고 있기 때문에
- 추상클래스를 상속받아 자식 클래스들이 각자의 방식으로 구현하는게 목적이기 때문에

'인강 > 자바(기본편)' 카테고리의 다른 글

상속  (0) 2024.07.22
this, 생성자  (0) 2024.07.02
변수와 초기화  (0) 2024.07.02
기본형 vs 참조형  (0) 2024.07.01
클래스와 데이터  (0) 2024.07.01
부모 클래스(슈퍼 클래스) : 상속을 통해 자신의 필드와 메서드를 다른 클래스에 제공하는 클래스
자식 클래스(서브 클래스) : 부모 클래스로부터 필드와 메서드를 상속받는 클래스

상속을 사용하는 이유

- 공통으로 사용되는 속성 혹은 기능을 상위 클래스에 정의하여 공유함으로써 중복 코드를 줄일 수 있다.

상속

- 자식클래스는 1개의 부모클래스만 상속받을 수 있다.
- 부모 클래스로부터 상속받은 필드나 메서드를 접근할때는 super 키워드를 사용한다.
- 자식 객체에서 기능을 호출시 자식 객체에서 해당 기능이 있는지 찾고 찾지못한다면 부모 객체에서 찾는다.
- 자바의 모든 클래스는 최상위 클래스인 Object클래스를 상속받는다.
- 자식 클래스의 인스턴스 생성시 부모 인스턴스도 같이 생성된다.

- 자식 인스턴스 생성시 부모 생성자가 호출된다.(하지만 기본 생성자는 생략 가능 -> 자바에서 자동으로 만들어 주기 때문)

 

메서드 오버라이딩을 하는 이유

- 부모 클래스의 메서드를 자식 클래스에서 재정의함으로써 다형성을 구현할 수 있다.- 부모 클래스의 메서드가 자식 클래스의 요구사항에 맞지 않은 경우 자식 클래스에서 해당 메서드를 재정의 할 수 있다.

 

메서드 오버라이딩 조건

- 메서드 이름이 같아야 한다.

- 메서드 매개변수(파라미터) 타입, 순서, 개수가 같아야 한다.

- 반환타입이 같아야 한다.

- 상위 클래스의 메서드보다 더 많은 체크 예외를 선언할 수 없다.

- final 메서드는 재정의를 금지한다.

- 부모 클래스의 메서드보다 접근제어자가 제한적이어서는 안된다.

    (ex)

    부모클래스 : protected, 자식클래스 : private, default  -> 불가능   

    부모클래스 : protected , 자식클래스 : public, protected  -> 가능

 

접근 제어자 이론 문제

https://rnwns2.tistory.com/145

 

접근 제어자 실습 문제

 

'인강 > 자바(기본편)' 카테고리의 다른 글

다형성  (0) 2024.07.23
this, 생성자  (0) 2024.07.02
변수와 초기화  (0) 2024.07.02
기본형 vs 참조형  (0) 2024.07.01
클래스와 데이터  (0) 2024.07.01

this

  - 자신의 인스턴스에 접근할때 사용

  - 보통 this.을 사용하여 멤버 변수에 접근함

  - 메서드, 생성자에서 사용하는 매개변수(파라미터)이름과 해당 클래스 멤버 변수명이 같을때 구분하기 위해 사용

public class Student {
    public String name;
    public String grade;

    public Student(String name, String grade) {
        this.name = name;
        this.grade = grade;
    }
}

생성자(constructor)

  - 생성자의 목적은 객체 초기화 이다.

  - 생성자의 이름은 클래스 이름과 같아야 한다.

  - 생성자는 반환 타입이 없다.

  - 생성자는 인스턴스를 생성한 후 바로 호출된다.(객체당 한번만 호출)

  - 개발자가 생성자를 작성하지 않으면 컴파일러가 자동으로 기본 생성자 삽입

  - 생성자는 오버로딩 가능하다

 

생성자 장점

  - 직접 정의한 생성자를 호출 하지 않을경우 컴파일 오류가 발생하기 때문에 필수값 입력을 보장할 수 있다.

 

this()

  - 생성자 내부에서만 사용할 수 있다.

  - 생성자의 첫 줄에서만 this()를 사용할 수 있다.

 

public class Student {
    public String name;
    public String grade;


    Student(String name, String grade) {
        this.name = name;
        this.grade = grade;
    }

    Student(String name) {
        this(name, "A");
    }
}

public class Main {
    public static void main(String[] args) {
        // Student student0 = new Student(); // error : no suitable constructor found for Student(no arguments)
        Student student1 = new Student("Kim");
        Student student2 = new Student("Kim", "C");

        Student[] students = {student1, student2};

        for (Student student : students) {
            System.out.println("student.name = " + student.name);
            System.out.println("student.grade = " + student.grade);
        }

    }
}

'인강 > 자바(기본편)' 카테고리의 다른 글

다형성  (0) 2024.07.23
상속  (0) 2024.07.22
변수와 초기화  (0) 2024.07.02
기본형 vs 참조형  (0) 2024.07.01
클래스와 데이터  (0) 2024.07.01

변수의 종류

멤버 변수 : 클래스 내부에서 선언

지역 변수 : 메서드 내부에서 선언, 매개변수도 지역 변수의 한 종류

 

변수의 값 초기화

- 멤버 변수(자동 초기화)

  - 개발자가 초기값을 지정할 수 있음

  - 초기값을 지정하지 않았을 경우

    - int -> 0

    - boolean -> false

    - 참조형 -> null

// 멤버 변수 초기화

class Test {
    int num;
    String str;
    boolean check;
    String[] strArr = new String[5];

    int[] numArr = new int[5];
}

public class Main {
    public static void main(String[] args) {
        Test test = new Test();
        System.out.println("test.num = " + test.num);  // 0
        System.out.println("test.str = " + test.str); // null
        System.out.println("test.check = " + test.check); // false
        System.out.println("test.check = " + test.strArr[0]); // null
        System.out.println("test.check = " + test.strArr[3]); // null
        System.out.println("test.check = " + test.numArr[0]); // 0
        System.out.println("test.check = " + test.numArr[3]); // 0
    }
}

 

- 지역 변수(수동 초기화)

  - 항상 직접 초기화해야 한다.

// 지역변수 초기화 안했을 경우

int num;
String str;
boolean check;
String[] strArr = new String[5];
int[] numArr = new int[5];

System.out.println("num = " + num); // error : variable num might not have been initialized
System.out.println("str = " + str);  // error : variable str might not have been initialized
System.out.println("check = " + check); // error : variable check might not have been initialized
System.out.println("check = " + strArr[0]); // null
System.out.println("check = " + strArr[3]); // null
System.out.println("check = " + numArr[0]); // 0
System.out.println("check = " + numArr[3]); // 0

 

 

'인강 > 자바(기본편)' 카테고리의 다른 글

다형성  (0) 2024.07.23
상속  (0) 2024.07.22
this, 생성자  (0) 2024.07.02
기본형 vs 참조형  (0) 2024.07.01
클래스와 데이터  (0) 2024.07.01

기본형(primitive type)

  - 정수타입 : byte, short, int, long

  - 실수타입 : float, double

  - 문자타입 : char

  - 논리타입 : boolean

 

참조형(reference type)

  - 배열 타입

  - 열거 타입

  - 클래스

  - 인터페이스

  - 기본형을 제외한 나머지

 

기본형 vs 참조형 - 변수 대입

대원칙 : 자바는 항상 변수의 값을 복사해서 대입한다.

- 기본형 : 변수에 들어 있는 실제 사용하는 값을 복사해서 대입

- 참조형 : 변수에 들어 있는 참조값을 복사해서 대입

// 기본형 변수 대입
int a = 10;
int b = a;

System.out.println("a = " + a); // 10
System.out.println("b = " + b); // 10

b = 20;

System.out.println("a = " + a); // 10
System.out.println("b = " + b); // 20



// 참조형 변수 대입
Student student1 = new Student();
student1.name = "kim";
Student student2 = student1;

System.out.println("student1.name = " + student1.name); // kim
System.out.println("student2.name = " + student2.name); // kim

student2.name = "Lee";

System.out.println("student1.name = " + student1.name); // Lee
System.out.println("student2.name = " + student2.name); // Lee

 

 

기본형 vs 참조형 - 메서드 호출

대원칙 : 자바는 항상 변수의 값을 복사해서 대입한다.

- 기본형 : 메서드로 기본형 데이터를 전달하면 해당 값이 복사되어 전달됌.

- 참조형 : 메서드로 참조형 데이터를 전달하면 참조값이 복사되어 전달됌.

// 기본형 메서드 호출
public static void main(String[] args) {
    int a = 10;
    System.out.println("a = " + a); // 10
    changePrimitive(a);
    System.out.println("a = " + a); // 10

}

static void changePrimitive(int x) {
    x = 20;
}

// 참조형 메서드 호출
public static void main(String[] args) {
    Student student = new Student();
    student.name = "kim";
    System.out.println("student.name = " + student.name); // kim
    changeReference(student);
    System.out.println("student.name = " + student.name); // Lee

}

static void changeReference(Student data) {
    data.name = "Lee";
}

 

'인강 > 자바(기본편)' 카테고리의 다른 글

다형성  (0) 2024.07.23
상속  (0) 2024.07.22
this, 생성자  (0) 2024.07.02
변수와 초기화  (0) 2024.07.02
클래스와 데이터  (0) 2024.07.01

클래스(class)

- 클래스에 정의한 변수들을 멤버 변수, 필드라고 한다.

  - 멤버 변수(Member Variable) : 클래스 영역에서 선언된 변수

  - 필드(Field) : 데이터 항목을 가리키는 용어(데이터베이스, 엑셀 등에서 각각의 항목을 지칭)

public class Student {
    String name; // 멤버 변수, 필드
    String grade; // 멤버 변수, 필드
}

 

인스턴스 생성

Student student; // 1. 변수 선언
student = new Student(); // 2. 인스턴스 생성
student = x001 // 3. 참조값 보관및 반환

객체(Object) : 클래스에서 정의한 속성과 기능을 가진 실체

인스턴스(Instance) : 특정 클래스로부터 생성된 객체를 의미함

'인강 > 자바(기본편)' 카테고리의 다른 글

다형성  (0) 2024.07.23
상속  (0) 2024.07.22
this, 생성자  (0) 2024.07.02
변수와 초기화  (0) 2024.07.02
기본형 vs 참조형  (0) 2024.07.01

+ Recent posts