-
GUI(Graphical User Interface)
말 그대로 그래픽으로 프로그램이 사용자와 소통하는 방식이다.
우연히 터미널을 열어보기 전까지는 원래 프로그램이 이런 방식으로만 돌아가는 줄 알았을 것이다.
개발자가 아닌 사람들도 편하게 사용할 수 있는 방식이다.
거의 모든 것은 다 GUI로 되어 있다.
CLI(Command Line Interface)
TUI(terminal user interface)라고도 한다.
개발자스러운 방식이다.
단색 창에 명령어를 입력해서 조작하는 방식이다.
Library
단어 뜻 그대로 실제 도서관에서 책을 빌려 읽듯이, 유사한 관심사를 갖는 함수들을 빌려서 재사용하기 쉽게 만든 것이다.
내가 만들지 않아도 다른 사람이 만들어 둔 라이브러리를 프로그램에 끌어와서 사용할 수 있다.
java.lang은 import하지 않아도 되는 자바의 대표적인 라이브러리다.
인스턴스(객체)
실제로 존재하는 것들은 모두 인스턴스이다.
프로그램에서는 클래스가 메모리에 실제로 올라간 것을 의미한다.
실제로 존재하는 것들은 모두 유일하기 때문에 인스턴스끼리는 같을(동일할) 수 없다.
자바에서 new로 인스턴스가 만들어지면 Heap영역에 생성되고, GC가 불필요한 인스턴스를 지운다.
가비지 컬렉터(GC)
메모리가 꽉차서 더이상 프로그램이 가동되지 않는 것을 막기 위해 더이상 참조되지 않는 값들을 메모리에서 지운다.
주로 heap영역에서 활동한다.
동일성 & 동등성
동일성은 정말 같은 것을 가리키는지를 의미한다.
메모리의 같은 주소를 가리키고 있다면 동일하다고 볼 수 있다.
Primitive 타입인 경우 값이 같으면 동일하다.
동일한 경우 == 연산자를 사용했을 때 true가 반환된다.
하지만 쌍둥이조차도 그 두 명은 각각의 사람이지 동일한 사람이라고 보지 않듯이 두 개의 객체는 객체가 가지고 있는 값끼리는 비교할 수 있어도 객체자체끼리는 무조건 서로 다른 것이다.
따라서 값을 비교해줄 때는 == 대신 .equals메소드를 자바에서는 쓰면 된다.
자바에서 문자열도 객체이기 때문에 ==가 아닌 .equals로 비교를 해야 정확한 값이 도출된다.
객체 지향
객체를 지향하는 방식이다.
객체를 지향한다는 것은 무슨 의미일까?
객체지향은 시스템을 자율적인 객체들의 공동체로 본다.
객체 지향은 모든 것을 부품(객체)으로 보고, 각 부품이 모여서 더 큰 부품이 된다고 본다.
레고블럭을 모아서 벽돌을 만들고 벽돌을 모아서 벽을 만들고 벽을 모아서 성을 만들 수 있듯이,
각각의 부품은 모여서 더 큰 부품을 이루고 그 부품들이 모여서 더 큰 부품이 된다.
따라서 객체들끼리 잘 협력해서 더 큰, 복잡한 객체를 만들게 하는 게 최종 목표이다.
그 말은 반대로 말하면 어떤 객체는 더 작은 객체들로 쪼갤 수 있고, 그 쪼개진 객체도 또 객체로 나눌 수 있다는 말이다.
어떤 것을 특정 역할을 하는 객체들의 집합으로 나눌 수 있고, 무한히 나누면 언젠가 복잡한 객체도 간단한 객체의 합이 된다.
따라서 객체지향프로그래밍은 작은 프로그램들을 잘 모아서 큰 프로그램을 만드는 방식이라고 볼 수 있다.
Primitive Type & Object Type
Java Data Type ㄴ Primitive Type ㄴ Boolean Type(boolean) ㄴ Numeric Type ㄴ Integral Type ㄴ Integer Type(short, int, long) ㄴ Floating Point Type(float, double) ㄴ Character Type(char) ㄴ Reference(Object) Type ㄴ Class Type ㄴ Interface Type ㄴ Array Type ㄴ Enum Type ㄴ etc.
primitive type은 선언이 되어야 사용할 수 있다.
그리고 OS에 관계 없이 자료형의 크기가 동일하고,
객체가 아니기 때문에 null값을 가질 수 없고, Null을 넣고 싶다면 Wrapper Class를 활용해야 한다.
스택 메모리에 저장된다.
primitive type이 아닌 내가 만든 클래스를 포함한 모든 것이 object type이다.
클래스 타입(class type) , 인터페이스 타입(interface type) , 배열 타입(array type) , 열거 타입(enum type) 이 있다.
String 타입은 기본형처럼 사용하지만 primitive type이라서 문자열끼리 비교할 때는 primitive type처럼 ==을 사용할 수 없고 equals를 이용해야 한다.
접근제어자(public, private, protected)
접근제어자는 가시성을 조절할 수 있다.
내부에서 접근할 수 있을지, 없을지를 결정해줄 수 있다.
- public
다른 파일에서 import만 해오면 쓸 수 있다.
메소드, 다른 파일에서 사용해야 되는 상수에 주로 사용한다.
- private
해당 파일을 제외하면 접근할 수 없다.
다른 파일에서는 값에 직접 접근하지 못하게 숨기고 싶을 때 private을 이용하면 된다.
- protected
같은 패키지 내에서는 접근할 수 있고, 다른 패키지에서 접근하려는 경우 상속받았을 경우만 접근할 수 있다.
패키지
비슷한 관심사를 가지고 있는 클래스 파일들을 모아둔 것.
메서드
어떤 객체가 할 수 있는 일을 의미한다.
프로그램이 복잡할 수록 객체를 만들어서 다른 객체들의 메소드를 불러와서 쓰는 방식으로 레고를 조립하듯 프로그램도 조립해야 한다.
static
static을 이용해서 생성되면 static영역에 할당된다.
static영역은 Garbage Collection이 관리를 하지 않고, 모든 객체가 접근할 수 있다.
따라서 인스턴스가 만들어지지 않았어도 사용할 수 있다.
GC가 관리를 해주지 않기 때문에 static을 남발하면 안된다.
자바(객체지향)에서의 추상화
단순화라고 생각하면 된다.
코드의 중복이 보였을 때 그 코드에 이름을 붙여주면 추상화가 됐다고 볼 수 있다.
그 코드가 하는 일에 이름을 적절히 붙여주면 그게 추상화다.
Lamda(람다)
함수를 하나의 식으로 표현한 것이다.
이름을 붙이지 않은 함수이기 때문에 익명함수에 해당한다.
익명함수기 때문에 재사용이 불가능하다.
따라서 재사용을 해야될 때는 람다를 쓰면 안 된다.
변수의 종류 (매개 변수, 지역 변수, 멤버 변수)
1. 매개 변수
데이터를 다른 객체에 넘겨줄 때 매개 변수를 사용한다.
메소드 등에서 소괄호 안에 인자로 받는 값이 매개 변수이다.
2. 지역 변수
임시적인 값이어서 해당하는 scope을 벗어나면 사라진다.
따라서 속하는 scope바깥에서는 사용할 수 없다.
매개변수는 지역 변수에 해당한다.
자주 사용했던 for문에서 선언하는 int i도 지역 변수여서 for 문 바깥에서 사용할 수 없다.
3. 멤버 변수
field라고도 한다.
클래스의 상단에 선언한다.
따라서 객체가 만들어졌을 때 선언되고, 객체가 사라지면 사라진다.
아무나 접근해서 바꾸면 안되기 때문에 private으로 선언해야 한다.
객체의 생명 주기(Life Cycle)
객체가 생성되어 소멸될 때까지의 기간을 의미한다.
static으로 선언된 클래스 변수가 가장 생명주기가 길다. (GC로도 사라지지 않기 때문에 클래스가 언로드 되어야 사라진다.)
아래의 주기를 거친다.
- Created(생성)
- 객체를 위한 메모리 공간을 Heap에 할당 후 객체의 생성자가 실행된다.
- in use or reachable(사용중)
- 객체가 생성되어 다른 객체에 의해 참조되어 있는 상태를 의미한다.
- invisible(사용 중이지만 접근 불가)
- 객체의 역할이 이미 종료되었어도 메소드가 리턴될 때까지 사용 중인 상태를 가지는 것.(반복문 안에서 계속 사용할때)
- Unreachable(사용되지 않음)
- Garbage Collectoion의 후보가 된다.
- Collected(GC 대상이 되는 상태)
- 메모리 해제 단계. 객체의 finlize()가 정의되어 있는지 판단하게 되고 정의되있다며 finalizer라는 queue에 넣고 없다면 다음 단계인 finalized 상태로 전환 시킵니다.
- Finalized(Finalize 를 거친 상태)
- Deallocated(메모리 해제 된 상태)
- 메모리 반환이 끝난 상태로 GC의 동작이 마무리 된 상태 입니다.
반환(return) & 반환 타입(Return Type)
void로 선언을 하면 반환되는 값이 없지만,
어떤 메소드를 실행했을 때 실행된 값을 받고 싶을 수 있다.
이 때는 void대신 도출하고 싶은 값의 타입을 써줘야 한다.
문자열 변환
숫자가 쌍따옴표로 감싸져 있을 때 이 값을 숫자로 취급하고 싶다면 문자열을 Int나 Long으로 변환해줘야 한다.
Integer.valueOf(String);
또한 Int나 Long을 문자열로 바꿔서 다른 객체에 주고 싶다면 문자열로 바꿔주면 된다.
Integer.toString(value);
문자열 비교
문자열은 primitive type이 아니기 때문에 ==로 비교하면 해당 변수가 저장된 위치가 비교되어 두 개의 다른 변수는 같은 문자열이 들어있어도 false가 나온다.
따라서 .equals를 사용해야 한다.
for each 문
for (<Type> <variableName> : <array>) { }
자바에서는 위 코드를 이용해서 우리가 원하는 배열의 모든 값을 돌면서 원하는 코드를 실행할 수 있다.
switch expressions
switch (대상) { case "1" -> ~~~; case "2" -> ~~~; }
modern java switch문에서는 위 코드처럼 어떤 대상이 case뒤에 오는 값에 해당할 때 실행할 코드를 간단히 적는 방식으로 프로그램을 제어할 수 있다.
final (상수)
final은 재할당을 못하게 한다.
primitive type을 final로 선언하면 값을 바꿀 수 없게 된다.
또한 final로 선언하는 경우 상속이나 오버라이딩을 할 수 없다.
상수인 경우 변수명을 전부 대문자로 표기한다.
의존객체는 final로 선언하자.
- 객체 타입
- 객체 변수에 final로 선언하면 다른 값을 참조할 수 없다.
- 객체 속성은 변경할 수 있다.
- 메서드 인자
- 메서드 인자에 final 키워드 붙이면 메서드 안에서 변수 값을 변경할 수 없다.
BigInteger
숫자가 long자료형의 최대값보다 커질 수 있는 경우에 범위가 정해져있는 자료형을 쓰면 오버플로우가 발생할 것이다.
따라서 BigInteger는 숫자를 문자열로 나타내서 매우매우 큰 숫자도 나타낼 수 있다.
하지만 숫자가 아니라 문자열이기 때문에 비교를 하거나, 연산을 할 때 Integer나 long과 사용 방식이 다르다는 점을 주의해야한다.
모듈러 연산자(mod)
유한 개의 정수만 사용하는 연산에 사용되는 연산자이다.
모듈러 연산자를 사용하면 결과 값이 항상 연산자 뒤에 오는 값 n보다 작은 양수 혹은 0이 된다.
% 로 표기한다.
표기법
- camelCase
- 낙타등처럼 생겨서 camel이라는 이름이 붙었다.
- 단어 연결부에서 단어 시작에 대문자를 써주고, 나머지는 소문자로 쓴다.
- 자바에서 변수명에 쓰인다.
- snake_case
- 모두 다 소문자를 쓰고, 단어 연결부에 _ 를 써준다.
- 자바에서는 사용하지 않는다.
- SCREAMING_SNAKE_CASE
- snake_case에서 소문자를 대문자로 바꿔주면 된다.
- PascalCase
- camelCase에서 시작하는 문자를 대문자로 바꿔준 표기법이다.
- 자바에서 클래스명에 사용된다.
관심사의 분리
비슷한 것끼리 모아두고 다른 것끼리는 구분하는 것을 의미한다.
관심사의 분리를 통해 코드의 크기가 무한히 커지지 않고 관심사에 따라 분리해서 유지보수 가능한 크기로 적절히 조절할 수 있다.
Collection
많은 데이터를 쉽고 효과적으로 처리할 수 있는 방법의 집합을 의미한다.
List
배열과 비슷한데 배열보다 편리한 기능을 많이 가지고 있는 타입이다.
동적으로 배열을 만들 수 있다.
ArrayList
List 중 간단한 형태의 자료형이다.
배열의 크기를 수정할 수 있는 배열이다.
일반적인 배열은 크기가 정해져 있다면, ArrayList는 값을 자유롭게 추가할수도 삭제할 수도 있다.
for each문과 궁합이 좋다.
class 상속
상속받는 타입에 해당하는 타입을 커스터마이징 해서 만들고 싶을 때 사용한다.
상속받은 객체가 가지고 있던 메소드 등은 당연히 다 사용할 수 있고,
추가적으로 메소드를 정의할 수 있다.
대학생은 학생 클래스를 상속받아 사용할 수 있다.
공통된 특성이 상위 클래스에 정의되어 있고, 그것을 상속받아서 하위 클래스를 서로 공통된 특성도 갖고 있으면서 차이점도 반영하여 만들 수 있다.
extends <부모클래스>
로 상속을 받을 수 있다.
생성자
new로 인스턴스를 생성할 때 실행된다.
인스턴스가 생성됐을 때 실행됐으면 하는 것을 생성자에 넣어두면 된다.
반환값이 없는 메소드이다.
의존성 주입이 가능하다.
의존성 주입, 제어의 역전
의존성 주입은 객체가 의존하는 또 다른 객체를 외부에서 선언하고 그 객체를 주입받는 것을 의미한다.
A가 B에 의존하고 있다면 B가 먼저 컴파일 된 후에 A를 컴파일 할 수 있다.
의존성을 주입받지 않고 코드 내에서 쓴다면 의존하고 있는 내용이 여러 군데 쓰여있을 때 수정하려고 할 때 너무 수정을 많이 해야될 것이다.
하지만 의존성 주입을 받으면 외부에 선언된 객체 하나만 수정해주면 한 번에 다 수정이 된 것이기 때문에 유지보수 측면에서 효율적이다.
this 키워드
객체 안에서 자신의 field나 메소드 등에 접근할 때 this.~~ 로 사용할 수 있다.
문맥에 따라 호출될 때마다 this가 가리키는 값이 바뀐다.
도메인
1. 소프트웨어로 풀고자 하는 문제 영역을 일컫는다.
- 도메인은 더 작은 도메인들으로 나눌 수 있다.
2. ip주소에 붙인 이름을 도메인이라고 한다.
도메인 모델, 도메인 객체
도메인 모델은 특정 도메인을 개념적으로 표현한 것이다.
도메인 모델은 엔티티와 value로 나눌 수 있다.
도메인 객체(엔티티)는 식별자를 가지고 있다.
따라서 값이 바뀌더라도 식별자가 동일하면 다른 객체라고 볼 수 없다.
객체의 식별자가 같으면 두 객체는 같다고 판단할 수 있다.
'메가테라' 카테고리의 다른 글
6주차 개념노트 (HTML, CSS 총정리) (0) 2022.09.25 4주차 개념노트 (0) 2022.09.11 [메가테라 루틴] 쓸 데 없는 생각말고 그냥 코딩 하기나 해~ (0) 2022.08.22 2주차 개념노트 (0) 2022.08.21 1주차 개념노트 (0) 2022.08.14 - Created(생성)