728x90
배경
- Assembly - 0과 1로 이루어진 기계어를 일상 용어로 만들기 위해 일대일로 매칭하는 코드표
- 기존에는 기계의 종류에 맞는 프로그램 소스 파일이 필요했는데, C언어의 등장으로 하나의 소스 파일(싱글 소스)만 가지면 알아서 컴파일러로 소스를 생성
인간 언어 체계와 기계어의 매칭이 1:1 → m:n 변환 - CBD
- SOA
클래스 vs 객체
나이의 유무에 따라 구분
- 클래스 - 분류에 대한 개념 (실체x), 같은 속성과 기능을 가진 객체를 총칭하는 개념
- 객체(속성 + 기능) - 실체 = 클래스의 인스턴스
추상화: 모델링
- 구체적인 것을 분해해서 관찰자가 관심 있는 특성만 가지고 재조합 하는 것
- 클래스 설계에서 추상화가 사용됨
Spring
- IoC/DI
- AOP
- PSA - 일관서 있는 서비스 추상화
자바와 절차적 / 구조적 프로그래밍
- 절차적 프로그래밍 - goto를 쓰지 말자 ▶ 프로그램의 실행 순서가 인간이 이해하기에 복잡해질 가능성이 있음
- 구조적 프로그래밍 - 함수를 쓰자 ▶ 중복코드 제거, 논리 분할
공유 사용시 문제 발생이 쉬운 전역변수보다 지역변수를 쓰라
변수 위치
메모리 구조
코드 실행 영역 | Static 영역 | |
Stack 영역 | Heap 영역 |
static
- 모든 클래스의 놀이터 (java.lang / 그 외 만들어진 클래스들)
stack
- 모든 메서드들의 놀이터
- 여는 중괄호를 만날때마다 스택 프레임이 스택 영역에 할당
- 스택 프레임의 제일 아래에 args를 저장할 변수 공간을 확보
package springbootStudy;
//java.lang + 클래스들이 stack 영역에 할당
public class Start1 {
//main( 이때 stack frame을 stack 영역에 할당
//stack frame의 맨 밑에 메서드의 인자 args를 저장할 변수 공간을 확보
public static void main(String[] args) {
System.out.println("Hello OOP!");
}
}
예제 1
package springbootStudy;
public class Start3 {
public static void main(String[] args) {
int i = 10;
int k = 20;
if(i == 10) {
int m = k + 5;
k = m;
} else {
int p = k + 10;
k = p;
}
//k = m + p;
}
}
멀티 스레드 / 멀티 프로세스
- 멀티 스레드 - 스택 영역을 스레드 개수만큼 분할해서 쓰는 것
하나의 스레드에서는 다른 스레드의 스택 영역에 접근할 수 없지만 스태틱 영역과 힙 영역은 공유
따라서 멀티 프로세스 대비 메모리를 적게 사용 - 멀티 프로세스 - 다수의 데이터 저장 영역, 다수의 T 메모리를 갖는 구조
추상화
클래스 멤버 = 정적 멤버 = static 멤버
- UML 표기법에서 정적 멤버에 대해서는 밑줄 사용
- 정적 메서드는 JVM 구동시 T메모리의 static 영역에 바로 배치되기 때문에 객체의 존재 여부에 관계 없이 쓸 수 있음
- 클래스의 인스턴스를 만들지 않고 사용하게 되는 유틸리티성 메서드
상속
- 상위 클래스의 특성을 하위 클래스에서 상속하고, 거기에 더해 필요한 특성을 추가, 확장해서 사용하는 것
- 확장, 분류도, 집합 등
객체 지향의 상속은 상위 클래스의 특성을 재사용하는 것
객체 지향의 상속은 상위 클래스의 특성을 확장하는 것
객체 지향의 상속은 is a kind of 관계를 만족하는 것
728x90