Variables

Memory

Stack Memory

  • 함수호출시에 사용하는 메모리 공간
  • 함수 호출이 종료되면 자동으로 메모리 반환

Heap Memory

  • 인스턴스에서 멤버변수에 접근할때 사용하는 메모리 공간
  • 각각의 인스턴스는 별개의 힙 메모리주소를 갖는다.
  • 힙 메모리는 Garbage Collector가 알아서 정리한다.

Constructor

Defualt Constructor

  • 선언된 생성자가 없다면 자바 컴파일러가 pre-compile단계에서 파라미터가 없는 기본 생성자를 만들어준다.

Access Modifier

  • 접근제어자라고 하며 변수, 메소드, 클래스 앞에 붙어 접근가능 번위를 제한한다. 객체지향에서 정보은닉을 위해 제공한다. 다음 네가지의 접근제어자가 있다.
  1. public
  2. private
  3. protected
  4. default

Static

  • 클래스변수, 혹은 정적변수라고도 하며 여러 인스턴스가 하나의 값을 공유할 때 사용한다.

Singleton Pattern

  • 디자인 패턴 중 하나이다.

ex) 회사라는 객체를 싱글톤으로 제공하고 싶다고 가정해보자.

  1. 회사는 public 클래스로 선언하고, 회사 인스턴스를 내부에서 static으로 먼저 만들어둔다.
  2. 회사의 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)으로, 프로그램 언어의 각 요소가 한가지 형태만 가지는 성질을 가리킨다.

상속은 언제 사용할까?

  1. IS-A관계 일반적 개념(general)과 구체적(specific)개념과의 관계 상위 클래스 : 일반적 개념 ex) 포유류 하위 클래스 : 구체적 개념 ex) 사람, 원숭이, 개, 고양이 ..
  2. 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으로 선언되어 있으니 인스턴스를 만들지 않고 바로 클래스.변수값 으로 접근할 수 있다.