Java class, 상속

EUNLEE·2022년 7월 12일
0

2022.07.12 화요일

Java 복습

💡 어제 배운 내용을 복습해봅시다.

  1. language spec
    • variable(변수)
    • Data type
      • primitive data type
        • 8개의 기본 data type
      • reference data type
        • class data type
      • 제어문
      • 연산자
  2. 객체 지향 개념
    • 🧐 언어에서 어떻게 표현 되나요?
  3. API
  • JVM이 우리 프로그램을 실행시켜준다.
  • JVM + core API = JRE
    • Java Runtime Environment(자바 실행 환경)
  • JVM + core API + unity = JDK
    • Java Development Kit
    • 현재 Java 버전은 18version
    • 일반적으로 사용되는 version은 Java8, Java11
  • Java는 Network, 분산처리 프로그램에서 가장 좋은 performance!
  • class의 집합이 곧 Java application이다.
  • Java source code 1개에 class 1개를 작성한다.
    • class이름으로 file의 이름을 명시한다.
    • 특히, public class의 이름은 무조건 파일명으로 사용한다.
    • 따라서 public class는 하나의 파일에 많아야 1개만 존재할 수 있다.
  • 전역(global) 개념이 없다.
  • application의 entry pointmain( )
/* 클래스를 구성하는 요소들 */

class Student {
		// 1. fields (변수들의 집합)

		// 2. constructors (생성자)

		// 3. methods

}
// 관용적으로 class를 작성할 때 fields -> constructors -> methods 순서로 작성한다.
  • program이 실행되면
    1. JVM이 기동된다.
    2. class loader가 실행되고 해당 class를 Loading한다.(class를 불러들여서 읽는다.)
      • class loader도 Java Program이다. 즉 우리 program과 다른 패키지에 해당한다. 이 class loader는 오라클에서 작성한 것.
    3. class file을 검사한다.
    4. main()을 호출한다.
      • main은 public이여야한다. 왜냐하면 class loader라는 다른 패키지에 의해서 호출되는 것이기 때문에 패키지에 상관없이 호출가능한 형태인 public으로 지정해야 한다.
      • instance를 생성하지 않고 main을 호출해야 하기 때문에 static으로 지정해야 한다.
      • 리턴값이 없다. return type을 void로 지정한다.
      • public static void main()

🌟 JVM의 Memory 구조 🌟

  1. Resister
  2. Runtime

Untitled.png

Method Overloading

method의 이름이 같아도 인자의 개수, type에 따라 다른 method로 간주

package & import

🌟 Access Modifier

  • public
  • protected
  • package(default)
  • private

Static block

main()을 사용하기 직전에 특수한 처리(ex. library loading)를 하기 위해 사용한다.

package lecture0712;

public class MyClass {
	
	// fields
	int aaa;
	static int bbb = staticCall();
	
	// 생성자 
	public MyClass() { // default constructor를 사용한다 하더라도 생성자는 쓰는게 원칙이다.
		
	}
	
	// static block
	// main이 실행되기 직전에 프로그램에서 필요한 다른 library 같은 것들을 loading할 필요가 있을 때 static block을 사용한다.
	// 프로그램 실행 전 사전작업이 필요할 때
	static {
		System.out.println("static block");
	}
	
	// method
	static int staticCall() { // static이니까 먼저 호출
		System.out.println("staticCall 호출되었어요!");
		return 100;
	}
	
	public static void main(String[] args) {
		System.out.println("main 호출");
	}
}

Inheritance(상속)


inheritance: 부모 class가 가지는 내용을 확장해서 자식 class를 만드는 방식

  1. extends keyword를 이용해서 상속을 구현한다.

  2. Java는 단일 상속만 지원한다. (다중 상속을 지원하지 않는다.)

    class Human {
    	String name;
    }
    
    class Person {
    	String name; // 이름 
    	String mobile; // 전화번호
    }
    
    class Student extends Person, Human{ // **다중 상속 불가능**
    	String dept; // 학과
    }
    
    class Teacher extends Person{
    	String subject; // 과목
    }
    
    class Staff extends Person{
    	int salary; // 월급
    }
    💡 다중 상속이 불가능한 이유

    → 상위 클래스가 같은 field를 갖고 있을 때 모호성이 발생한다. (위의 예시 코드에서 상위 코드은 Human과 Person 둘다 String name 이라는 동일한 filed를 가지고 있다.) 자바는 이러한 가능성을 아예 배제한다.

  3. 🧐 상속은 항상 좋은가?

    • 코드 재사용과 유지보수 측면에서는 👍🏻
    • 상속 관계에 있으면 두 클래스가 강하게 결합된다.(tightly coupled) → 재사용에 문제가 발생 👎🏻 이 문제는 나중에 어떻게 해결하는지 알아보자. (지금은 관련 지식이 너무 적어요ㅎㅎ)

Constructor가 상속에서는 어떻게 동작하나요?

  • constructor는 상속되지 않아요.
  • private access modifier로 지정된 field, method도 상속되지 않아요.
💡 📌 **Java의 모든 class는 무조건 Object class를 상속하고 있다.**

📌 Java의 모든 class는 특정 package 안에 포함되어 있다.

🧐 그렇다면 Object class는 어느 package에 묶여서 제공이 되나요?

🤓 Object class는 java.lang이라는 package로 java.lang.object로 제공됩니다.

‼️ Object class는 최상위 super class
Class Object is the root of the class hierarchy. Every class has Object as a superclass. All objects, including arrays, implement the methods of this class.

package lecture0712;
import java.lang.*; // 기본으로 제공된다. -> extends Object라고 써도 오류가 안나는 이유

class Person extends java.lang.Object{
	String name; // 이름 
	String mobile; // 전화번호
}

class Human extends Object{ // extends Object를 쓰지 않아도 javac 컴파일러가 알아서 붙여준다.
	String name; // 이름 
}

class Student extends Person{
	String dept; // 학과
}

public class School {
	public static void main(String[] args) {
		**//** **Student s = new Student();**
		// **Person s = new Student();
		Object s = new Student();**
		// **is-a relationship**
		// **subclass is a superclass**
	}
}

Untitled1.png

💡 Method Overriding(메소드 재정의)

field 재정의 -> overriding이라는 표현은 쓰지않는다.(overriding은 method에 국한)

method 재정의는 지향하지만 field를 재정의하는 것은 지양한다.

💡 this와 super

this: 현재 사용하는 객체의 reference

super: 현재 사용하는 객체의 reference의 상위 type

super(): 상위 클래스의 생성자 호출

this(): 자신의 class가 가진 다른 생성자를 호출

**final**

  • 변수 앞에 붙으면 상수 처리(ex. final int k = 100;)
  • class 앞에 붙으면 상속이 안된다.(ex. final class A { })
  • method 앞에 붙으면 overriding 금지(재정의가 안된다.) (ex. final void kk() { })

Abstract class(추상 클래스)

abstract method가 단 1개라도 class 내부에 존재하면 abstract class

method의 선언만 존재하고 정의가 없다.(method가 하는 일이 정해지지 않음)

→ abstact class는 instance를 생성할 수 없다.

package lecture0712;

// 추상 클래스(abstract class)
public abstract class UpperClass {
	// field
	String name;
	int age;
	
	// method
	public abstract void printAll(); // abstract method
}

class subClass extends UpperClass{
	
	@Override
	public void printAll() {
		// TODO Auto-generated method stub
		
	}
}
💡 abstract class를 사용하는 이유

공통 기능으로 묶기 위해서 사용한다.(interface를 통일하기 위해) 즉, 인터페이스를 통일하기 위해서 사용하는 것이다.
(ex) 상위 클래스 Animal에 메서드 eat()이 있다. 하위 클래스인 Bird와 Tiger에서 비슷한 기능의 메서드를 having food() 또는 having meal()처럼 작성하면 복잡하고 사용하기 어렵다.

interface: 추상 class의 아주 특별한 형태

  1. 모든 method가 추상 method이다.
  2. 모든 field는 public static final 이다.
  3. 이러한 class를 interface라고 한다. (이 경우 class라고 쓰지 않는다.)
  4. 🌟 is-A 관계가 성립한다.
interface myInterface {
	
	// fields
	public static final int kk = 0; // public static final은 안써줘도 자동으로 붙는다.
	String aa = "Hello";
	
	// methods
	public abstract void printAll();
	
	public abstract void myPrint();	
}

public class MyClass implements myInterface {

	@Override
	public void printAll() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void myPrint() {
		// TODO Auto-generated method stub
		
	}
	
}

0개의 댓글