Part2 - 객체지향 프로그래밍(1)
Variables
Memory
Stack Memory
- 함수호출시에 사용하는 메모리 공간
- 함수 호출이 종료되면 자동으로 메모리 반환
Heap Memory
- 인스턴스에서 멤버변수에 접근할때 사용하는 메모리 공간
- 각각의 인스턴스는 별개의 힙 메모리주소를 갖는다.
- 힙 메모리는 Garbage Collector가 알아서 정리한다.
Constructor
Defualt Constructor
- 선언된 생성자가 없다면 자바 컴파일러가 pre-compile단계에서 파라미터가 없는 기본 생성자를 만들어준다.
Access Modifier
- 접근제어자라고 하며 변수, 메소드, 클래스 앞에 붙어 접근가능 번위를 제한한다. 객체지향에서 정보은닉을 위해 제공한다. 다음 네가지의 접근제어자가 있다.
- public
- private
- protected
- default
Static
- 클래스변수, 혹은 정적변수라고도 하며 여러 인스턴스가 하나의 값을 공유할 때 사용한다.
Singleton Pattern
- 디자인 패턴 중 하나이다.
ex) 회사라는 객체를 싱글톤으로 제공하고 싶다고 가정해보자.
- 회사는 public 클래스로 선언하고, 회사 인스턴스를 내부에서 static으로 먼저 만들어둔다.
- 회사의 static객체에 접근할 수 있도록 getInstance메소드에서 인스턴스를 return하도록 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Company {
private static Company instance = new Company();
private Company() {} //private생성자
//외부에서 바로 호출할수 있도록 static으로
public static Company getInstance() {
if(instance == null){
instance = new Company();
}
return instance;
}
}
Inheritance
- 상속이라 부르며, 부모클래스의 성질을 자식클래스에서 받아 쓰는것을 말한다.
Overloading vs Overriding
- Overloading : 같은 이름을 갖지만 받는 파라미터가 다른 여러개의 메소드를 사용하는 것.
- Overriding : 부모클래스에 선언된 메소드를 자식클래스에서 재정의하여 사용하는 것.
Copy Array
Annotation
- @Override : 재정의 된 메소드라는 정보 제공
- @FunctionalInterface : 함수형 인터페이스라는 정보 제공
- @Deprecated : 이후 버전에서 사용되지 않을 수 있는 변수 및 메서드라는 정보 제공
- @SupressWarning : 특정 경고가 나타나지 않도록 함
Virtual Method
Polymorphism
- 다형성이라고 부르며, 객체지향 프로그래밍이 갖는 특징중 하나이다. 상속과 오버라이딩, 오버로딩등으로 구현한다.
- 사전적 의미 : 프로그램 언어의 다형성(多形性, polymorphism; 폴리모피즘)은 그 프로그래밍 언어의 자료형 체계의 성질을 나타내는 것으로, 프로그램 언어의 각 요소들(상수, 변수, 식, 오브젝트, 함수, 메소드 등)이 다양한 자료형(type)에 속하는 것이 허가되는 성질을 가리킨다. 반댓말은 단형성(monomorphism)으로, 프로그램 언어의 각 요소가 한가지 형태만 가지는 성질을 가리킨다.
상속은 언제 사용할까?
- IS-A관계 일반적 개념(general)과 구체적(specific)개념과의 관계 상위 클래스 : 일반적 개념 ex) 포유류 하위 클래스 : 구체적 개념 ex) 사람, 원숭이, 개, 고양이 ..
- HAS-A관계 한 클래스가 다른 클래스를 소유하는 관계
Up-Casting
- 자식 클래스의 타입을 부모클래스의 타입으로 변환하는 것을 말한다.
업캐스팅에 대한 부분을 놓친것같아 구글링하여 발췌한 예시를 정리한다. Link : https://madplay.github.io/post/java-upcasting-and-downcasting
class Person{
String name;
public Person(String name){
this.name = name;
}
}
class Student extends Person{
String grade;
public Student(String name){
super(name);
}
}
위와 같이 선언된 Person, Student클래스가 있다고 가정해보자. 그러면 다음과 같이 업캐스팅을 할 수 있다.
Student student = new Student("dboo");
Person person = student; //Up-Casting
Person jaeho = new Student("dboo"); //Up-Casting
student 인스턴스를 Person타입으로 형변환 한 모습이다. Up-Casting이라고 주석처리한 두 부분이 모두 업캐스팅이 일어나는 부분이다. 이렇게 업캐스팅을 하고 나면, Student만의 멤버변수인 grade에 대해서는 사용할 수 없게 된다.
person.grade = "4.5"; // 컴파일 에러가 난다는것!
학점 4.5를 받지 못해서 컴파일 에러가 나는것이 아니다(?)
Down-Casting, instanceof
Down-Casting
- 묵시적으로 상위 클래스로 형변환된 인스턴스를 원래 자료형으로 변환하는 것을 다운캐스팅이라고 한다.
좀더 쉽게 말하자면 업캐스팅한 인스턴스를 원래대로 돌리는 것을 말한다. 업캐스팅의 예제에서 Person을 Student로 다음과 같이 다운캐스팅 할 수 있다.
Person person = new Student("dboo"); //Up-Casting
Student student = (Student) person; //Down-Casting
한군데 바뀐점은 다운캐스팅할때에는 (Student)
부분이 없었는데 이번에는 인스턴스 앞에 (Student)
을 붙여준다는 것이다.
업캐스팅의 경우는 (Student)
을 붙여도 되고 붙이지 않아도 된다.
하지만 다운캐스팅할 때에는 (타입)
을 붙이는 명시적 변환을 해주어야 한다.
학생으로 다운캐스팅을 해줬으니, 우리는 학점을 받을 수 있다!
student.grade = "4.5"; //오예 4.5!
instanceof
- 해당 인스턴스의 형을 검사해준다.
Person dboo = new Student("dboo"); //Up-casting
Student student_dboo = (Student) dboo;
if(student_dboo instanceof Student){
System.out.println("student_dboo는 학생입니다.");
}
if(dboo instanceof Person){
System.out.println("dboo는 사람입니다.");
}
Abstract class
- 추상메소드를 포함한 클래스
- 추상메소드 : 구현코드가 없고, 선언부만 있는 클래스
- 반대 개념 : concrete class
- abstract라는 예약어를 사용한다.
- 추상클래스는 new(인스턴스 화)할 수 없다. (중요!)
선언은 다음과 같이 한다.
public abstract class Animal {
public abstract void walk();
public abstract void sleep();
}
abstract메소드를 사용하려면, class선언부에도 abstract 키워드를 붙여 하위 클래스에 이것이 추상메소드를 가진 추상클래스라는것을 알려줘야 한다.
구현은 다음과 같이 한다.
public class Human extends Animal{
public void walk() {
System.out.println("사람은 두발로 걷습니다.");
};
public void sleep() {
System.out.println("사람은 누워서 잡니다.");
};
}
public abstract class Monkey extends Animal{
public void sleep() {
System.out.println("사람은 누워서 잡니다.");
};
}
위에 두 클래스가 각각 Animal 추상클래스를 구현하고 있는데 차이가 있다. Human클래스는 모든 추상메소드를 구현했고, Monkey클래스는 하나만 구현이 되어있다.
그러면 Monkey클래스에는 아직 구현하지 못한 추상메소드가 남아있고 이것은 또다른 하위 클래스가 받아서 구현을 할 수도 있기 때문에 Monkey클래스 또한 추상클래스가 되는 것이다.
하지만 모든 추상메소드를 구현했다고 클래스 앞에 abstract키워드를 못 붙이는 것은 아니다.
Template Method
- final 키워드로 선언한 메소드. 하위클래스에서 재정의 할 수 없다.
- Template Method Pattern : 디자인 패턴의 일종. 프레임워크에서 많이 사용되는 설계 패턴이다. 전체적인 구현흐름을 정의하고 메소드 구현을 하위 클래스에 위임한다.
public static final
- 프로젝트 구현 시 여러 파일에서 공유하는 상수값을 사용할때 편리하다.
public class Define{
public static fianl int MATH = "1001";
public static fianl int ENG = "1002";
}
public class Test{
public static void main(String[] args){
System.out.println(Define.MATH); // 1001
System.out.println(Define.ENG); // 1002
}
}
static으로 선언되어 있으니 인스턴스를 만들지 않고 바로 클래스.변수값 으로 접근할 수 있다.