💡 어제 배운 내용을 복습해봅시다.
/* 클래스를 구성하는 요소들 */
class Student {
// 1. fields (변수들의 집합)
// 2. constructors (생성자)
// 3. methods
}
// 관용적으로 class를 작성할 때 fields -> constructors -> methods 순서로 작성한다.
public
으로 지정해야 한다.static
으로 지정해야 한다.public static void main()
🌟 JVM의 Memory 구조 🌟
Method Overloading
method의 이름이 같아도 인자의 개수, type에 따라 다른 method로 간주
package & import
🌟 Access Modifier
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
: 부모 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는 상속되지 않아요.
private
access 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**
}
}
💡 Method Overriding(메소드 재정의)
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
}
}