💡 어제 배운 내용을 복습해봅시다.
/* 클래스를 구성하는 요소들 */
class Student {
// 1. fields (변수들의 집합)
// 2. constructors (생성자)
// 3. methods
}
// 관용적으로 class를 작성할 때 fields -> constructors -> methods 순서로 작성한다.
public으로 지정해야 한다.static으로 지정해야 한다.public static void main()🌟 JVM의 Memory 구조 🌟
Method Overloadingmethod의 이름이 같아도 인자의 개수, type에 따라 다른 method로 간주
package & import🌟 Access ModifierStatic blockmain()을 사용하기 직전에 특수한 처리(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: 부모 class가 가지는 내용을 확장해서 자식 class를 만드는 방식
extends keyword를 이용해서 상속을 구현한다.
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를 가지고 있다.) 자바는 이러한 가능성을 아예 배제한다.
🧐 상속은 항상 좋은가?
💡 📌 **Java의 모든 class는 무조건 Object class를 상속하고 있다.**Constructor가 상속에서는 어떻게 동작하나요?
- constructor는 상속되지 않아요.
privateaccess modifier로 지정된 field, method도 상속되지 않아요.
📌 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**
}
}

field 재정의 -> overriding이라는 표현은 쓰지않는다.(overriding은 method에 국한)
method 재정의는 지향하지만 field를 재정의하는 것은 지양한다.
💡 this와 superthis: 현재 사용하는 객체의 reference
super: 현재 사용하는 객체의 reference의 상위 type
super(): 상위 클래스의 생성자 호출
this(): 자신의 class가 가진 다른 생성자를 호출
**final**final int k = 100;)final class A { })final void kk() { })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의 아주 특별한 형태public static final 이다.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
}
}