Java
자바의 컴파일 과정
숙제
자바의 Stack과 Heap 메모리
자바 세상의 객체지향 원리
접근 제한자
왜 우리는 항상 클래스의 멤버 변수는 꼭 private
으로 선언하는가?
public
접근 제한자로 선언하면 어떤 문제가 발생하는가?
public class CodingTest {
private String testResult;
private int score; // 0 ~ 5;
public void CodingTest(String result, int score) throws Exception {
setTestResult(result);
setScore(score);
};
public void setTestResult(String result) throws Exception{
if(result.equalsIgnoreCase("PASS") || result.equalsIgnoreCase("NOT PASS")){
this.testResult = result;
}
else throw new Exception();
};
public void setScore(int score) throws Exception{
if(score >= 0 && score < 6)
this.score = score;
else throw new Exception();
};
}
캡슐화
상태(변수 or 데이터)와 행동(함수 or 메서드)을 하나의 단위로 묶는 것을 말한다. 객체지향 프로그래밍을 지원하는 대부분의 언어에서 제공하는 클래스를 통해서 캡슐화를 제공한다. 그런데 상태와 행동을 한 덩어리로 묶는 것이 왜 정보 은닉화 연관이 있는걸까? 그리고 객체지향은 캡슐화 기능을 왜 제공하는걸까?
먼저 우리는 2가지 중요한 사실을 알아야 한다. 위에서 이야기 한 것처럼 객체가 상태와 행동을 함께 가지는 복합적인 존재이고, 객체가 스스로 판단하고 행동하는 자율적인 존재라는 것이다. 객체가 자율적인 존재로써 적절한 행동(더하기)을 통해 문제(a와 b의 합을 구하라)를 해결하려면 객체가 어떤 생각을 하고 있는지 외부에서 알고 간섭할 수 없도록 해야, 객체가 스스로 올바른 판단을 하고 행동을 할 수 있는 것이다. 그래서 우리는 클래스의 상태(변수)를 정의할 때 대부분 private
접근 제한자를 사용했던 것이다.
단순히 캡슐화 정분 은닉화를 해주는 것이 아니다. 캡슐화 + 접근 제한자를 통해서 정보 은닉화가 이루어지는 것이다. 그리고 정보 은닉화를 하는 이유는! 객체의 행동이 올바르게 동작할 수 있도록 하기 위함이다.
public class Calculator {
private Long calculatedResult;
public Long getCalculatedResult(){
return this.calculatedResult;
}
public void sum(int a, int b) {
this.calculatedResult = Long.valueOf(a + b);
}
}
public class Calculator2 {
public Long calculatedResult;
public Long getCalculatedResult(){
return this.calculatedResult;
}
public void sum(int a, int b) {
this.calculatedResult = Long.valueOf(a + b);
}
}
public class Main {
public static void main(String[] args) {
Calculator c = new Calculator();
Calculator c2 = new Calculator2();
c.sum(1,2);
c2.sum(1,2);
c.calculatedResult = 100L; // occur Error
c2.calculatedResult = 100L; //
System.out.println(c.getCalculatedResult()); // output: 3
System.out.println(c2.getCalculatedResult()); // output: 100
}
}
상속
오버라이딩/오버로딩
오버라이딩
부모 클래스로 부터 상속 받은 메소드를 재정의하는 것.
예제 코드
@Getter
@Setter
public class Parent {
private String sex;
private String name;
public void sayHello(){
System.out.println("안녕하세요.");
}
}
@Getter
@Setter
public class Child extends Parent {
public Child(){
super();
}
@Overriding
public void sayHello(){
System.out.println("ㅎ2");
}
}
오버로딩
‘과적하다’라는 의미를 가진다.
동일한 메서드명으로 메서드를 정의하는 것. 그래서 과적 또는 과부하라는 Overloading이라는 명칭 붙음.
단, 인수(parameter)의 타입이 다르거나, 개수가 달라야 한다. 리턴 타입만 달라서는 안된다.
예제 코드
public class Student {
private int grade;
private String sex;
private String name;
public void play(String gameName){
System.out.printf("Playing %s", gameName);
}
public void play(String gameName, int grade){
if(grade > 3)
System.out.printf("Playing %s, and enable chat", gameName);
else
System.out.printf("Playing %s, and disable chat", gameName);
}
}
추상화/인터페이스
추상화
복잡한 자료, 모듈, 시스템등으로 부터 핵심적인(=공통적인) 개념 또는 기능을 간추려 내는 것을 추상화라고 한다.
예를 들어, 독일 3사 브랜드의 특정 모델(C클래스, 3시리즈, A6)을 클래스화 한다고 생각해보자. 이것들을 모두 독립적인 클래스로 정의해도 되지만, 그렇게 된다면 중복된 코드가 생겨나고, 그로 인해 생산성은 떨어지고, 유지보수는 어려워지게 된다.
여기서 “자동차”라는 추상화 클래스를 만들고 핵심적인 개념 및 기능을 구현 또는 정의한다면 이것을 구현하도록 한다면 생산성은 높아지고 유지보수에도 용이한 구조가 될 것이다.
자동차라는 추상화 통해 정의한 추상화 클래스이다.
추상화 클래스 규칙2.
추상화 클래스는 new
키워드를 이용해서 인스턴스화 할 수 없다. 무조건 자식(=하위)클래스를 통해서 인스턴스화 될 수 있고, 자식 클래스의 생성자 함수 안에서 super()
메소드를 이용해 추상 클래스의 생성자 호출이 가능하다.
public abstract class Car {
private boolean isDoorLock;
private String brand;
private String engine;
private String color;
private int speed;
private int wheel;
public Car(boolean door, String brand, String engine, String color, int speed, int wheel){
this.isDoorLock = door;
this.brand = brand;
this.engine = engine;
this.color = color;
this.speed = speed;
this.wheel = wheel;
};
public void pushDoorLockButton(){
this.isDoorLock = !this.isDoorLock;
}
public abstract void stepOnAccelerator();
public abstract void stepReleaseAccelerator();
public abstract void stepOnBreak();
public abstract void stepReleaseBreak();
}
인터페이스
Garbage Collector의 역할, 원리
정의
프로그램을 개발하다 보면 유효하지 않은 메모리 공간(Heap)이 발생한다. 그 공간을 개발자가 직접 삭제하여 유효 공간으로 만드는 언어들도 있는데, JVM 기반의 JAVA는 JVM 가비지 컬렉터가 불필요한 메모리를 알아서 찾고, 그것들을 정리 해준다. 그것을 우리는 가비지 컬렉터(Garbage Collector, GC)라고 한다.
구조
동작 방식
Linked List vs Array List(=Array) 정의와 차이점
숙제
Spring Boot
Database