-
[JAVA] 자바 총정리개발 강의 정리/JAVA 2021. 6. 21. 19:53
JAVA의 이해
1) JDK -> Java Development Kit
JDK = JRE + 각종 개발 도구
2) JRE -> Java Runtime Environment
:자바 프로그램의 실행환경
* JRE = JVM +자바 표준 라이브러리
3) JVM -> Java Virtual Machine (자바 가상의 기계)
: 말 그대로, 가상의 PC 라는 의미
4) Java Platform:말그대로, "운영체제(=플랫폼)"의 한 종류!
*GraalVM변수
1. 변수
: 하나의 값을 담는 그릇
- 값을 바꾸고 싶다면 안에 있는 값을 비우고 채워넣어야한다.
2. 변수의 정의 = 변수의 선언 + (값으로)초기화ex)
int age;
System.out.println(age);
=> 오류
: 변수를 사용하려면 변수 정의(Lvalue, Rvalue 모두 있어야함)를 해야한다.
3. 블록 (중괄호)
-사용자 블록(User-defined block)도 만들 수 있음.
4. 변수의 생명주기
변수가 생성된 블록을 벗어나면 파괴된다.
5. main() 메소드 : Startup/Entry point
public static void main(String[] args){}
수행주체 : JVM의 "main" 스레드가 수행!!
6. 변수타입
boolean 타입은 비트가 정해져있지 않다. 플랫폼에 따라 다르다.
정수타입보단 무조건 실수타입이 크다.
기본타입보단 참조타입이 크다.
정수<실수<참조
정수타입의 변수 ---> int로 선언
실수타입의 변수 ---> double로 선언
7. 진수
0,1,2,3,4,5,6,7,8,9 (10진수)
0,1,2,3,4,5,6,7 (8진수) -> 0숫자(java기준)
0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F (16진수) ->0x숫자(java기준)
0,1 (2진수)
8. 연산자/피연산자
ex) result = value + 10
*연산자(Operator) : +
*피연산자(operand) : value, 10
9. 어노테이션
@ : 어노테이션의 시작.
10. 연산식 : 여러개의 연산자와 피연산자로 구성된 문장
표현식(Expression) : 위의 연산식을 프로그램언어에서는 "연산식"이라 하지 않고,
"표현식"이라고 부르며, 아무리 복잡한 표현식이라도 수행결과는 오직 1개의 값을 생성.
11. 플래그 변수
boolean 타입으로 조건문 안에서 스위치 처럼 쓰이는 변수연산자
1. 연산자.
+ : 문자열끼리 쓸때 = 문자열 연결 연산자.
-전위/후위 연산자
*핵심은 대입 연산자다. 단일 연산자로 사용하면 전위 후위의 의미가 없다. 똑같다.
2. 이항연산자는 반드시 연산자와 피연산자의 타입을 맞춰놓아야한다.
3. 정수의 부호 연산자 산출타입은 int 타입이 된다.
short s =100;
short result3 = -s; //컴파일 에러
// => java에서는 정수 연산의 결과는 int로 반환함. (int보다 작은 타입의 경우. long은 long으로 반환. )
short result3 = (short)-s; //형변환 해주어야함.4. 기본타입
(1) 정수타입 Wrapper Type Class
-byte ---------------------> Byte
-short---------------------> Short
-char ---------------------> Character
-int ---------------------> Integer
-long ---------------------> Long
(2) 실수타입 Wrapper Type Class
-float---------------------> Float
-double--------------------> Double
(3) 논리타입
-boolean-------------------> Boolean
5. NaN / Infinity
-NaN(Not a Number) : 숫자로 표현할 수 없는 값을 의미.-Infinity : 무한대를 의미.
log.info(Double.isInfinite(z));//무한대인지 검사.
log.info(Double.isNaN(z)); //숫자로 표현할 수 있는지.
6. 오류와 예외
일상용어 프로그램 언어
오류(Error) ------->예외(Exception)
7. Overflow --변수가 저장가능한 최대값을 초과
Underflow --변수가 저장가능한 최소값을 초과
8. 클래스(class)의 대 분류
(1) "실행" 클래스
main()메소드가 있어, 실행가능한 클래스
(2) "라이브러리" 클래스
maint()메소드가 없어 실행되지 않는 클래스
9. new 연산자 역할********암기*********
-지정된 타입의 클래스로부터 객체를 힙영역에 생성.
-new 연산자 뒤에 나온것은 생성자. 생성자를 호출해서 생성한 객체의 초기화 작업 수행
-초기화까지 끝낸 객체의 주소를 반환한다.
10. 참조타입으로 넘어가는 순간 비교 연산자를 사용하면 주소를 비교하는 것이 된다.
11. java.lang 패키지 : 자바 언어의 기본 . import하지 않고 사용 가능
12. equalsIgnoreCase(String anotherString)
:대소문자 구분 없이 비교.메소드
1. ASCII = ISO-8859-1 (공식 문자집합 이름)
2. 메소드를 사용할 때에는 메소드의 사용법을 알고 써라!
즉, Method Signature를 확인하고 써라!
ctrl + 메소드 명을 누르면 메소드의 개요를 보여줌
Method Signuture => Method의 HEADER 부분을 의미
1. 메소드의 이름
2. 메소드의 매개변수들
3. 메소드의 반환타입
4. 메소드의 접근제한자
Method Chaining => 호출하는 메소드가 반환한 객체의 멤버를 계속해서 호출하는 것.
3. CharSequence = String 으로 생각해도 무방
매개변수에 '...' 이 있다면 0개 이상의 매개 변수를 줘도 상관 없다.
4. 메소드 오버로딩 (세가지 중 하나 만족)
- 매개변수 개수
- 매개변수 순서
- 매개변수 타입
5. 입문자 입장에서는 아래에 focus를 가지십시오.
(1) 비교연산자 -> 왜? 다양한 제어문의 "조건식을" 만들때 사용.
(2) 논리연산자 -> 왜? 상동
6.Math.random()메소드 : 0.0<=x <1.0범위의 실수 값을 무작위로 생성
-----------
=>오른쪽의 범위를 포함하지 않으면
:Half-Open
---> [0.0, 1.0) 이렇게 표현함.
양쪽의 범위를 모두 포함하면
:Full closed
7. for문
변수 i가 반복횟수를 결정 ---> 이 i변수를 "카운터 변수" or "루프제어변수"
초기식은 단 한번만 수행 --> 역할 : 카운터 변수 생성
증감식의 목적 : 카운터 변수의 값을 변경
조건식의 목적 : 반복을 할 것이냐! 안 할것이냐! 결정
-초기식에 변수는 하나 이상 선언 할 수 있다.
-초기식/조건식/증감식은 생략 가능하다.(세미콜론은 절대 생략 불가)
-모든 식이 생략되면 ===> 무한루프
: 일부러 무한루프를 만들 경우 탈출 조건을 만들어 줘야함.
// for(;;) {//무한루프
// if(조건식) {
// break;
// }//if
// }//for
8. while문
-조건 생략 불가
-break문을 사용해 반복문을 나오는 것보다 조건식을 이용하는게 좋음.참조타입
1.NULL
: 참조 변수 안에 그 어떤 객체의 주소도 가르키고 있지 않는 것.
2. 힙 영역
-각 객체가 들어올때마다 다른 객체와 구분 되는 소위 "식별자"가 있다.
-객체와 배열은 힙 영역에 생성된다.
-만약 이 힙 영역의 메모리가 가득 차면 Out Of Memory 발생 => 큰일
3. ==, != 연산
-기본타입
====> 변수의 실제값 비교
-참조 타입 : 배열, 열거, 클래스, 인터페이스
====> 동일한 객체를 참조하는지, 다른 객체를 참조하는지
4. Object
: 모든 클래스의 조상.
5. 클래스 =붕어빵 틀
붕어빵을 굽기 위해 키는 불 = new
밀가루 반죽, 팥, 슈크림 =생성자 (객체의 초기화 팥, 밀가루의 양을 결정)
완성된 붕어빵 = 객체
6. 레퍼런스
Object obj1 =new Object(); //힙 영역에 새로운 객체 생성
Object obj2 =new Object();
log.info("- obj1:"+obj1);
log.info("- obj2:"+obj2);
=============================================
▶ 10:25:44.660 INFO (main) {Ex01} - - obj1:java.lang.Object@2f8f5f62 ===> :레퍼런스
▶ 10:25:44.660 INFO (main) {Ex01} - - obj2:java.lang.Object@6483f5ae
7.겍체의 레퍼런스 체계****fqcn@<객체의 논리적인 주소>
FQCN : Fully Qualified Class Name => 풀 패키지 명
객체의 논리적인 주소 : 객체의 식별자(=해쉬코드)를 16진수로 표현한 값
--------------
-> 힙 영역에서 객체를 구분하기 위한 식별자
패키지 : a.b.c. 생성한 클래스 명 : Example
=>FQCN : a.b.c.Example(클래스명)
패키지 : d.e..f 생성한 클래스 명 : Example
=> 패키지까지 포함하는 이유 : 클래스 명이 충돌 할 수 있기 때문. 클래스 이름 만으로는 고유함을 유지할 수 없다.
ex ) java.lang.Object
8. Method Overriding ===> Method Overwritting
9.assert keyword 옵션 설정하기
(1)이클립스상 run 버튼 옆 화살표
(2)첫번째 실행 클래스의 설정 바꾸기
(3)run configuration
(4)arguments
(5)VM argyments에 --enableAssertions 혹은 -ea(축약형. 파이프 한번 ) 입력
(5)apply 누르기
10. 자바언어에서는 예외가 발생하였을 때에
무슨 이유로, 어떤 소스에서, 몇 행에서 오류가 발생했는지를 알려주기 위해서
출력하는 일련의 문장들을 "Stack Trace" 라고한다! (*중요*)Exception in thread "main" java.lang.NullPointerException //main이라는 메소드 안에서 널포인터 예외가 발생했다.
at exam04.Ex05.main(Ex05.java:14) //^ at은 밑에서부터 위로 본다.
at ... | 내가 만든 것을 찾는다.
at ... | 내가 만든게 아니라면 무시한다.
at ... |
11. 자료구조
: 어떤 프로그램 언어에서도 다 소위 "자료구조(Data Structure)"를 제공.
즉, "여러 데이터를 어떻게 하면 효율적으로 조작/저장" 할수 있을지를 고민해서 나온것으로
대표적으로 "배열(Array)"이 있음.
자료구조는 눈으로 봤을 때는 변수이다.
12. 배열
-자바의 배열은 한번 생성하면, 그 요소의 타입과 배열의 크기를 절대 바꿀 수 없다.
-인덱스의 번호가 0부터 시작한다.
-인덱싱 기법 : 배열이름[인덱스번호]
- 장점 : 중복된 변수 선언 줄이기 위해 사용
- 반복문을 이용해 요소들을 쉽게 처리
-
13. 자료구조를 이용시 주의할점
-반드시 먼저 값이 완성된 뒤에 로직을 수행.
-핵심 로직과 입출력 코드는 분리.참조타입
1. 메소드 선언시
(1) Argument --------> "전달인자" (매개 변수에 전달하는 값)
(2) Parameter --------> "매개변수" (밖에서 값을 받아서 블록 안에서 쓰도록 하는 것. )
2. 가변인자 : ...
메소드 선언시, 매개 변수가 0개 이상의 전달 인자를 받아야 되는 경우 (즉, 개수가 정해져있지 않다!! )
...기호는 매개변수 선언시 "가변인자"를 받는 매개변수를 선언할때 사용
[Ljava.lang.String;@6483f5ae
--
=> 배열 타입이라는 뜻.
(1) ... : 배열이라는 뜻
...를 보면 자체가 몇개든 인자값을 받을 수 있도록 생성되었구나를 알 수 있다.
값을 하나도 전달하지 않으면 빈 배열이라도 만든다는 것을 알 수 있다.
(2) 가변인자를 매개변수로 받을 때는 무조건 제일 마지막에 위치해야한다.
ex) static int add ( int temp,int ...ops )
-----------
3. Arrays 클래스에 상당히 많은 메소드들이 있다.
코딩테스트에서 이용
4. 로거로 로그를 남길때는 로그의 성질과 레벨을 정해야한다.
ex) debug
5. 열거타입.
:특정한 값만을 갖도록 하는 것. 변수가 가질 수 있는 값의 범위를 한정짓는것(ex. 요일, 성적등급 )
한정된 값은 열거 상수로 정의
최종적으로 상수가 저장 된다.
개발자가 직접 만든다.
*이름짓기 관례
열거 상수는 대문자로 선언.
단어의 구분이 필요하면 언더바(_) 이용 EX) MONDAY_WEEK
enum 타입을 별도의 소스파일로 만들면 다른 클래스에서도 사용한다는 뜻.(원칙은 별도로 구성하는 것이 맞다.)
enum 타입을 같은 소스 파일 내에 선언하면 그 의미는 현재 그 소스파일 내에서만 사용하는 한정된 범위 내에서만 쓰겠다는 뜻
*대원칙 *
자바 소스파일 (xxx.java) 하나 안에는 오로지 하나의 참조타입만 선언하라.(열거, 클래스, 인터페이스) (배열은 제외)OOP
C: 모든게 "함수(function)"로 이루어짐
C++19/ex0 :
1. -----Programming Paradigm-----
OOP : Object - Oriented Programming
DDP : Data-driven Programming
EDP : Event-driven Programming
AOP : Aspect-Oriented Programming
2. OOP : Object - Oriented(지향!) Programming
레고블럭처럼 부품 객체를 만든 다음에 그걸 조립해서 완성된 프로그램을 만들자!
객체란?
눈에 보이는 것
눈에 보이지 않는 것
전부 객체. 대부분 "명사"에서 나옴.
객체의 상호작용
상호작용의 핵심은 "메서드"
무결성 : 데이터의 결함이 없다.
3. OOP의 3대 특징
-캡슐화(Encapulation) : 객체 내부의 무결성 유지
*무결성 : 결함이 없는 성질
무결성 : 일관성 + 정확성
-상속(Inheritance) :부모(상위)객체가 자식(하위)객체에게 물려주는 행위
*부모(상위)객체가, 자식(하위)객체에게 부모의 필드와 메소드를 물려주는 관계
자식(하위)객체는, 부모가 물려준 필드와 메소드 뿐만 아니라 자기만의 필드와 메소드도 가진다!!
*(***중요***) OOP의 3번째 특징인 "다형성(Polymorphism)"의 전제조건(=필수조건)
*extends / implements 둘다 상속임
-다형성(Polymorphism)
동물(부모)
사람 강아지 고양이
동물이라면 소위 소리를 내지 않는 동물은 거의 없다. 동물에게 사운드(소리를 내다) 라는 메서드(행위)가 있다면 사람과 강아지, 고양이역시 소리를 내야한다. 자식 객체에서는 같은 사운드 메서드에서 각자 다른 소리를 낸다.
똑같은걸 물려 받아도 자식객체가 뭐냐에 따라 다르게 나온다. =다형성
*부모객체 (동물- sound메소드)를 상속받는
자식객체 (강아지, 고양이)가 부모의 메소드를 상속 받았을때 (******전제조건*****)
*자식객체의 sound가 각각 다르게 결과가 나온다!
즉, "다"양한 "형"태로, 결과가 나온다! --> "다형성"이라한다!
다형성-1. 부모 타입에는 모든 자식 객체가 대입.
집나간 자식이 있다고 하자. 자식에게는 부모가 있다.
자식이 돌아오면 부모는 반긴다. 부모는 자식이 들어오는걸 막지 않는다.
외부에서 봤을 때는 자식이 보이지 않을 정도로 옷으로 감싼다.**중요**
부모와 자식관계일때만 가능(즉, 상속관계라는걸 전제로 한다. )
자식이라고 주장하는 사람이 왔다.=> 누구세요?
다형성-2.인터페이스 타입에는 모든 구현 객체가 대입.
4. Lombok은 오로지 클래스 만들때에만 사용 가능!!!!클래스
1. 컴파일된 .class 파일에는 중간코드인 "바이트코드"가 들어있다.
2. JIT컴파일러가 바이트코드를 실행 코드로 바꿔준다.
3. 소스파일당 하나의 클래스 생성하는 것이 좋음
4. 두개 이상의 클래스도 선언 가능하지만 public 키워드를 붙일 수 있는 클래스는 소스파일 이름과 동일한 클래스만 가능하다. (문법)
5. 선언한 개수만큼 바이트 코드 파일 생성.
6. 클래스변수라는 말은 없음! 참조타입 변수!
7. 클래스의 구성요소 : 필드, 생성자, 메소드 + "Static "
8. 인스턴스 필드는 각자 다른 값을 갖고 잇음.
정적 필드는 공유되는 필드.
9.
--------------------------------------------
메소드 영역
--------------------------------------------
(1) 우리가 컴파일한 클래스 파일이 있다고 합시다
TTT.class
(2) JVM 머신이, 위 (1) TTT.class 파일이 필요해지면,
JVM 안에는 .class 파일을 읽어다가(=loading),
아래의 타입의 객체로 만들어서, 메소드 영역에 집어 넣습니다.
java.lang.Class
Class clazz;
우리가 만든 클래스이든 남이 만든거이든 표준라이브러리에서 제공하는 것이든 어느 클래스를 사용하거나 실행하려고 할때 "메소드 영역(Class Area / Method Area)"에서 찾는다.
메소드 영역에서 클래츠 파일이 없다면 class not found 예외 발생
벌츄얼 머신에는 "클래스 로더"라는 것이 있는데 이 로더가 "바이트 코드"를 그대로 읽어다가 메소드 영역에 클래츠 (Clazz) 파일로 넣게 되어있음
자바 가상머신이 .class 파일(바이트 코드가 들어있는) 을 찾아 Class타입의 clazz파일로 메소드 영역에 꽂아 넣음.
Static 키워드가 붙어있지 않은 Field는 힙에 생성
Static Field/Static Method 는 Class Area에 소속된다.(=Clazz객체에 소속된다. )
Static 키워드가 붙든 안 붙든 Method는 공유된다.
인스턴스 Field는 생성자가 초기화
Static Field는 누가 ? => static initializer
Static initializer는 딱 한번 실행 됨. 클래스 로더가 읽어낸 바이트 코드 파일을 Clazz파일로 메소드 영역에 꽂아 넣기 직전에 "딱 한번" 실행. *클래스 로더가 호출*
필드의 초기화는 생성자에서 초기화 하기 때문에 "선언"하려고 노력해야지 "정의"하면 곤란하다.
Static initializer는 디폴트 생성자 처럼 개발자가 직접 만들지 않으면 자바 컴파일러가 생성.
** Stack Trace란?
:변수를 저장하는 스택 영역과 관련 있음.
필드는 지역변수에 포함 되지 않는다.
지역변수란? 메서드에 있는 변수.
자바언어에서는 전역 변수가 없다!!!!!!!!!!!!!!!!!!
필드라는 것은 있어도 전역변수는 없다! !! ! ! ! ! ! !
return 키워드
-메서드를 종료 시킴
-표현식의 값을 호출자에게 반환한다.메소드
*Getter/Setter 메소드*
1. Setter메소드 : 외부해서 전달해준 전달 인자 값이 "유효한지 검증" (=> 필드의 값 무결성 유지)후 필드의 값으로 초기화 시켜줌.
필드를 감춰뒀을 때 필드의 값에 접근하도록 도와줌
2. Getter메소드 : 필드의 값을 가져올때 사용
*Overriding ====> Overwrite (덮어쓰다!!!!)
힙 영역 안에 있는것이 GC대상
static 키워드를 붙이면 clazz소속(메소드영역)이 되기 때문에 GC대상이 아님.
객체를 생성하지 않고 singleton을 호출하기 위해 static을 붙인 get메서드가 된다.
*synchronized 키워드
스레드란? 실오라기 하나, 머리카락 같은거 하나를 스레드라고 부름
메인 스레드가 움직이면 메인메서드가 호출된다.
그래서 스레드는 스레드마다 자기가 실행 시키는 일련의 실행문장이 존재
get인스턴스를 여러 스레드가 동시에 호출한다면 과연? 동일하게 싱글톤 객체의 레퍼런스를 얻어갈수 있을까?
=> 얻어갈 수 있게 만들어주는게 synchronized 키워드
여러 스레드를 나란히 줄지어 놓고 첫번째 스레드 호출, 두번째 스레드 호출 ...n번째 스레드가 호출 해놓고 아무리 동시에 호출한다해도 순서대로 줄 수 있도록 (모두가 객체의 레퍼런스를 얻어 갈 수 있도록)하는 키워드이다.
동시에 접근한다해도 위험함. => 임계영역
이런 임계영역을 보호하도록하는것이 synchronized키워드이다.
Singleton 패턴이 완전하려면 이 synchronized키워드가 필요하다.
Protected = default + (alpha)
객체의 모델링과 상관 없이
객체가 가지고 있는 필드에 대해서
1. Getter 메소드 => 필드의 값 반환해주는 메소드
* 메소드 이름 관례
가. get + 필드명
나. 예외 : 만일 필드의 타입이 논리타입(boolean)이라면
is + 필드명
2. Setter 메소드 => 필드의 값을 변경해주는 메소드
가. set + 필드명 (매개변수 선언부 - 매개변수명을 필드명과 동일하게 )어노테이션
1. 어노테이션
: 프로그램에게 추가적인 정보를 제공해주는 메타 데이터
이 데이터가 무엇을 의미하는지. 이 데이터를 설명해주는 데이터를 "메타 데이터"라고 한다.
* 어노테이션 역시 "참조타입"이다.
<용도>-@ 를 붙이면 컴파일시 강력하게 컴파일러가 체크.
안 붙이면 컴파일러가 개입하지 않는다.
-개발툴이 프로그램 제작에 관여. (코드도 자동 생성 ex. Lombok)
-실행(런타임)시 특정 기능 실행하도록 정보 제공
//어노테이션 속성의 타입으로는 아래가 가능 :
// (1) 기본 타입
// (2) String
// (3) 열거타입(Enumeration type)
// (4) Class 타입(Clazz)
// (5) 위의 (1)~(4)타입으로 구성된 배열(Array)
<어노테이션 만드는 방법>
- 어노테이션 소스파일(클래스) 역시 어노테이션 이름과 동일하게 만든다.
- @interface를 사용해서 어노테이션을 정의한다.
- 어노테이션의 기본 속성(element)는 뒤에 소괄호가 붙는다.
- 외부의 값을 어노테이션의 속성의 값으로 받을 수 있다.
만약 이때, 값을 받지 못한다면?=> 기본 타입 값(0,0.0,null)을 따르거나 default 구문이 있다면 default 값으로 받는다.
2. POJO : Plain Old Java Object
상속을 받지도 않고 평번한 클래스에서 만든 객체.
3. clazz 객체를 보관하고 잇는 곳이. 메소드영역(=Class Area)
VM이 붕어빵 틀로 활용하려면 .class 파일을 clazz객체로 만들어져 class Area에 올라와야 VM이 인식 가능하다. clazz 객체는 결국 class에 대한 모든 정보를 갖고 있다. 이것이 바로 자바 리플렉션이다.
4. 상속
현실세계 : 부모가 자식에게 물려주는 행위. 부모가 자식을 선택해서 물려줌.
OOP : 자식(하위, 파생) 클래스가 부모(상위) 클래스의 멤버를 물려받는것.
자식이 부모를 선택해 물려받음.
상속 대상 : 부모의 필드와 메소드.
실무용어: child class가 parent class를 extends한다.
'개발 강의 정리 > JAVA' 카테고리의 다른 글
[JAVA] 추상클래스, 익명자식객체생성, 클로져 (0) 2021.06.23 [JAVA] enum, extends, overriding (0) 2021.06.22 [JAVA 백준 알고리즘] 4673번 셀프 넘버(Self Number) (0) 2021.05.27 [JAVA 백준 알고리즘] 백준 알고리즘 컴파일 에러 해결 방법 (0) 2021.05.16 [JAVA] 타입 변환, 객체 (0) 2021.05.10