일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 일반 예외
- 예외클래스
- 개발자취업
- 99클럽
- 예외
- til
- try-catch-finally 블록
- 예외 처리
- 로켓펀치 #취준컴퍼니 #취업 #일상 #취준생
- throws 키워드
- 항해99
- 다중 catch 블록
- 실행 예외
- 코딩테스트준비
- Today
- Total
innn
2022.06.30 본문
자바 한 바퀴 돌고 클래스 복습
사물로 표현할 수 있는 것 = 필드
필드와 Behavior
자바에서 클래스란 사물과 추상화. (여기선 클래스 안에서)
어제는 공통적 특성이나 비헤이비어를 하나로 끌어당겨서 쓰는게 추상화.(모델링에서)
추상화 = 메소드
틀 = 시스템구조 = 클래스
시스템 구조하고 behaivor
명세화한다(specification)
클래스라고 한다면 필드와 메소드를 생각해야해
어떤 건 메소드가 없을 수도 있어. 클래스는
클래스 A - 필드, 메소드 있어
필드만 있어도 되고, 메소드만 있을 수 있어. 그래도 클래스야.
필드만 있는 클래스를 DTO라고 함. 데이터베이스 내용을 끌어당길때, 그 값과 DTO가 같아야 객체에 실을 수 있음.
그래서 DTO임. 필드만 있는 클래스는 Data Transfer Object .
어떤 걸 보면 그거에 대한 필드가 뭘까? 메소드가 뭘까? 생각하는 버릇이 들어야함.
눈에 보이는 걸 클래스로 생각하면서 저걸 어떻게 표현하지 라고 고민하는 습관을 들여야함. 그런 훈련을 해야함.
다양한 걸 보고 그걸 어떻게 클래스로 표현할까. 필드하고 메소드로 표현할까 생각해야함.
필드는 사물로 표현 가능하다.
그렇게 만들어진 구조가 있으면 거기서 생성된 것을 하나의 객체라고 한다.
+ 객체 하고 개체는 달라.
객체 (Object) 개체(Entity)
객체는 클래스로부터 생성된걸 객체라고함. 클래스가 존재해야 생성될 수 있는 것이 객체임.
개체는 클래스라는 개념 없어 그냥 하나하나를 개체라고함. (ERD Entity Relation)
객체는 클래스로부터 생성된 하나의 사물.
우리가 공부할때 놓치는 건, 이 사실을 숙지하지 않는 것임.
클래스는 필드와 메소드, 사물과 추상화(Behavior) 이 사실을 완전히 암기해야함.
힙 메모리의 주소가 완전히 다르잖아 그러니까 객체는 다른거지.
힙 메모리의 주소(내가 타는 그랜져와 앞집 아저씨의 그랜져가 다른 것)
cpu가 메모리에 있는 데이터를 읽어놔서 레지스터에 갖다놔야 읽는거야 ㅓㅁ퓨터 구조가.
메모리 할당을 받지도 않으면 읽지 못하는것임
그래서 메모리에 넣어줘야하는건데
3가지 방법 메모리 / 스택 / 힙메모리
메모리는 저장 용도가 아니고, CPU가 동작하기 위해서 명령어를 갖고 있는 것.
하드웨어적인 메모리가 있는데 그 메모리 중에 OS가 쓰는 영역이 있다 = 시스템 영역 그것이. (이 분야는 지금은 몰라도 됨 자바는 어차피 못 읽음, C는 읽음)
세가지 용도가 있는데 CPU
클래스마다 기능은 하나만 넣어야 좋음.
하나의 메인 메소드에 여러 기능 넣는게 제일 하수.
-Java Compiler: Java source(.java)파일을 바이트 코드로 바꿔 .class파일로 만들어 준다.
-Class Loader:만들어진 class파일을 JVM내로 load하고 배치시킨다.
-Execution Engine: 배치된 Byte code를 명령어 단위로 실행한다.
-Garbage Collector: 어플리케이션이 생성한 객체(인스턴스)의 생존여부를 판단해서 더이상 참조되지 않거나 null인 객체의 메모리를 해제시킨다.
-Runtime Data Area: JVM이 실행되면서 할당받은 메모리 공간이다.
Runtime Data Area
-Method Area: 클래스,인터페이스에 대한 런타임 상수풀, 메서드, 필드,생성자,타입 정보, static 변수 ,static메서드 ,바이트 코드등을 보관한다. 전체 thread에서 공유할 수 있고, 시작시에 생성되서 종료될 때 까지 존재한다. 따라서 전역변수를 너무 많이 쓰게되면 메모리 초과 위험이 있다.
-Runtime constant pool:각 class,interface는 각각의 런타임 상수풀을 가진다. 상수들은 메서드와 필드,데이터들의 래퍼런스 값을 가지고 있다. 중복되는 정보가 필요하게 되면 런타임 상수풀에서 꺼내서 사용한다. (symbol table)
-Heap Area: 래퍼런스 타입을 갖는 객체(인스턴스),배열 등이 동적으로 생성되서 저장되는 곳이다. new 연산자를 통해 heap영역에 객체를 생성해서 메모리를 부여받고 stack영역에 참조변수에 실제 객체의 레퍼런스 값을 리턴받는다. 이 래퍼런스 값을 통해서만 객체를 다룰 수 있다.
- new 연산자로 생성된 객체, Array와 같은 동적으로 생성된 데이터가 저장되는 공간
- Heap에 저장된 데이터는 Garbage Collector 가 처리하지 않는한 소멸되지 않는다.
- Reference Type 의 데이터가 저장되는 공간
- 모든 스레드에서 정보가 공유된다.
-Stack Area: 각 스레드 시작시에 하나씩 할당되고 종료될 때 해제된다.메소드 호출시에 프레임을 추가하고(push) 종료되면 제거한다(pop). 지역변수, 매개변수, 메서드 정보들의 임시 데이터가 저장된다.
primitive타입 변수는 스택 영역에 직접 값을 가진다.reference 타입의 변수는 힙 영역이나 메소드 영역의 객체 주소를 가진다.
-PC Register:현재 실행중인 JVM 주소를 저장한다.
프로그램 실행은 CPU에서 인스트럭션(Instruction)을 수행.
-Native Method Stack Area:자바 외 언어로 작성된 네이티브 코드를 위한 메모리 stack이다.
Java Native Interface를 통해 호출되는 C/C++등의 코드를 수행하기 위한 스택이다.
인터페이스는 can do this >>
Information Hiding = 정보 숨기기
= encapsulation 왜 해야한다고 생각해? 객체 손상 막기 위해서, 유지보수를 위해서
static이 최악인 이유가 결합도가 100프로라서. 결합도 안하기 위해서 메소드를 쓰는 거임.
메소드 파라메터 쓰는 것이 결합도를 낮추기 위해서임.
결합도 제일 높은 프로그램이 클래스 하나에 모든걸 다 집어넣은거
유지보수를 할 수 없음. 캡슐화는 낮은 결합도를 유지할 수 있도록 해준다.
결합도의 반대가 응집도
응집도가 높다 ? 클래스 내부에서 모든 걸 해결하는 것
다른곳에서 끌고 오는 순간 응집도가 낮아지고 결합도가 높아진다.
어떤 기능하나를 여기 안에서 해결하려고 노력해야함 그래야 응집도가 높아지니까.
캡슐화는 겉멋 들면 안돼 정확히 알라고 공부해야해. 그게 프로그래머임.
어떻게 ? 얘의 궁극적 목적이 뭐야? 결합도를 안하기 위해, private로 막아버렸구나. 그래야 결합도가 낮춰지니까.
인캡슐레이션 결합도가 낮춰지기 위해서 왜필요하냐 결합도 떄문이다. 결합도의 반대말 응집도 이걸 다 술술 기억해야함.
캡슐화를 하게 되니까. private로 다 묶어버리니까
객체간의 정보를 주고받는 게 메소드야. private 데이터를 getter setter를 통해서만 데이터를 주고 받으라 이거임.
getter, setter 객체간의 정보를 주고 받기 위해서 이거 역시 .
필드를 왜 private로 하는 건지 이걸 왜 private로 해야하는지 생각하면서 프로그래밍을 짜야함.
왜? 접근제한자로 private를 쓰는지 생각해봐야함.
언제 캡슐화를 하는 게 바람직하냐? 내가 만든 클래스가 여러사람이 쓰는 라이브러리 클래스인 경우는 반드시 이렇게 해야함.
모델링에선 밑에있는 자식들을 위로 끌어올ㄹ리는 게 인헤리턴스.
밑에서 위로 올라가는 게 모델링에선.
밑에의 공통적인 걸 뽑아서 올린 거
상속엔 캡슐화가 숨어있어
객체간에 서로 대화는 어떻게 해? 메소드를 통해서....
static의 변수는 뒤에 그 값을 바꿀 수 있음
static final의 변수는 그 값을 바꿀 수 없음.
'JAVA > 자바' 카테고리의 다른 글
예외 클래스 (0) | 2022.09.26 |
---|---|
UML 클래스 다이어그램의 관계 (0) | 2022.09.06 |
starUML을 이용해 UML 그리기 (0) | 2022.09.02 |
2022.07.18 자바 웹 프로그래밍과 ERD (0) | 2022.07.18 |
API 클래스에 대하여 (0) | 2022.06.24 |