패키지 선언
임포트 구문
클래스 선언 {
4. 멤버변수
5. 생성자
6. 메소드
}
cf) 패키지 컴파일/실행
#> javac -d . XX.java
#> java aa.bb.XX
ex) day02/A.java
ex) day02/B.java
ex) day02/C.java
ex) day02/D.java
ex) 붕어빵.java
ex) day03/A.java
2) 지역변수
<1> 선언초기화
<2> 파라미터 (매개==아규먼트)
ex) day03/B.java
ex) day03/A.java
ex) day03/C.java
ex) day03/D.java, E.java(재미로)
<5> 형변환(Type Casting)
1> 자동(암시적/Implicit) by JVM
-> 범위가 작은 Type ▶ 큰 Type
2> 강제(명시적/Explicit) by ?
ex) day03/F.java
<6> 예외 형변환
-> 정수형타입(byte, short, char, int)끼리의 연산의 결과는 int
ex) day03/G.java
<7> 초기값
-> 정수(0, 0L), 실수(0.0f, 0.0), 불린(false)
ex) day03/H.java
<8> 존재이유: 실행의 효율성
cf) 배열변수
-> 배열을 저장하는 변수
어떤 프로그램이 실행되고 있을 때..
어느 한 시점에서의 CPU연산은 어떤 특정 코드부분을 실행하고 있을 것이다
그 코드부분을 '제어점'이라하ㅗ, 그 제어점을 집합을 '제어'라 한다
즉, 프로그램의 실행흐름(Line)을 제어라 한다
JVM -> main() -> ... -> main() -> JVM
ex) day04/A.java
ex) day04/B.java, C.java, D.java
ex) day05/A.java
ex) day06/A.java
ex) day06/B.java, C.java
ex) day06/D.java, E.java
ex) day06/F.java
같은 타입의 데이터 '저장소'로써 생성될 때 크기가 고정되는 '객체'
선언
type 배열변수[]; //ex) String items[];
생성
배열변수 = new type[크기]; //ex) items = new String[4];
초기화
배열변수[인덱스] = 데이터; //ex) items[0] = "봄";
선언 및 생성
type 배열변수[] = new type[크기]; //ex) String items[] = new String[4];
선언 및 생성 및 초기화
type 배열변수[] = {데이터1, 데이터2, ...};
//ex) String items[] = {"봄", "여름", "가을", "겨울"};
ex) day06/G.java
ex) day06/H.java
형변환
형변환이 가능한 데이터라면 형변환되어져서 입력 됨
//ex) int is[] = {b, s, c, i, (int)f};
ex) day06/I.java
이차원
일차원 배열을 데이터로 갖는 배열
ex) day07/A.java
N차원
(N-1)차원을 배열을 데이터로 갖는 배열
ex) day07/A.java
같은 타입의 '참조형'데이터 '저장소'로써 그 크기가 변할 수 있는 '객체'
1. 종류
1) java.util.Collection
| |
java.util.List java.util.Set
| |
..... .....
2) java.util.Map
|
java.util.Hashtable, ....
2. 특징
1) List
- 중복을 허용
- 순서를 보존
ex) day07/B.java
2) Set ( 비유: 집합 )
- 중복을 허용 X
- 순서를 보존 X
ex) day07/C.java
3) Map ( 비유: 1:1 함수 )
- 한쌍으로 저장(key와 value)
- 순서를 보존 X
- key는 중복허용X, value는 중복허용O
ex) day07/C.java
cf) AutoBoxing: ( 기본형 -> Wrapper class )
ex) day08/A.java
ex) day08/B.java
(속성값의)은닉성( Information Hiding )
속성값(데이터)을 외부 객체로부터 '숨기는 것'
ex) day08/C.java
(메소드의)캡슐화( Encapsulation )
ex) day08/C.java, D.java
ex) day09/A.java
정의: 스스로, 인터넷, 책
( 호출시 그 형태에 매핑되서 호출되도록 )
파라미터의 종류나 순서나 갯수가 다른 '같은 이름의 메소드나 생성자를 여러개 정의하는 것'
종류
1) 생성자
2) 메소드
특징
1) 반환타입과 관계 없음
2) 상속관계라면 다른 클래스에서도 오버로딩 가능
3) 형변환이 가능한 파라미터라도 오버로딩으로 인정
ex) day09/B.java
ex) day09/C.java
super
1) 정의: 부모의 '객체' 또는 '생성자'를 의미하는 대명사
2) 사용예
<1> 부모의 생성자를 호출할 때
<2> 이름이 같은 부모의 멤버를 자식에서 접근할 때
<3> 오버라이딩되기 전의 부모메소드를 자식에서 호출할 때
ex) day09/D.java
클래스, 인터페이스, 변수, 생성자, 메소드 앞에 붙어서 그 기능을 '제한'하는 예약어
접근제한자( Access Modifier )
1) 종류
<1> public: 제한이 없음
<2> protected: 같은 패지키 안 or 상속관계의 부모자원
<3> default ( package == friendly ): 같은 패지키 안
<4> private: 자신의 클래스 안
2) 특징
<1> 클래스나 인터페이스 앞의 접근제한자는 public 과 default 만 가능
<2> public 클래스는 파일이름과 이름이 같아야 함
3) 범위
- 넓은 순위: public > protected > default > private
- 강력 순위: public < protected < default < private
ex) day10/A.java
ex) day10/B.java , C.java
ex) day10/D.java
cf) 추상클래스: abstract 가 붙은 클래스
추상메소드: abstract 가 붙은 메소드
ex) day10/E.java
'프로그래머가 임의로' 설정하는 패키지, 클래스, 변수, 메소드 '이름'
(1) 규칙
1) 숫자가 맨 앞에 나올 수 없음
2) 특수문자 _와 $만 가능 ( 맨 앞에 나와도 됨 )
3) 길이의 제약은 없음
ex) day10/F.java
(2) 관례
1) 클래스와 인터페이스 이름은 첫문자를 대문자로 시작
2) 상수는 전체 문자를 대문자
3) 패키지, 변수, 메소드 이름의 첫문자는 소문자로 시작
4) 2개 이상의 단어 조합은 다음 단어의 첫문자를 '대문자'로 하거나 '_'로 처리
5) _와 $는 자제함
6) 의미있는 단어로 생성함
비슷한 종류의 '기능'이나 '업무'를 가진 클래스와 인터페이스들의 묶음
(1) 형태
클래스 최상단에 package 라는 예약어를 사용
( ex: package soo.aa.bb; )
(2) 컴파일
#> javac -d . XXX.java //상대경로(현재 디렉토리)
#> javac -d ./classes XXX.java //상대경로(하위 디렉토리)
#> javac -d ../ A.java //상대경로(상위 디렉토리)
#> javac -d C:\SOO A.java //절대경로
ex) day11/A.java
(3) 실행
#>java soo.aa.bb.A //패키지 최상단 디렉토리로 이동 후 실행
(4) 압축
#>jar -cvf p.jar soo
ex) day11/AUser.java
(5) classpath ( *** )
1) -classpath 법 ( 유효범위: javac.exe, java.exe )
<1> 디렉토리
#>javac -classpath C:\SOO\Java\day11\classes AUser.java
#>java -classpath .;C:\SOO\Java\day11\classes AUser
<2> jar
#>javac -classpath C:\SOO\Java\day11\jar\p.jar AUser.java
#>java -classpath .;C:\SOO\Java\day11\jar\p.jar AUser
2) set classpath 법 ( 유효범위: cmd )
<1> 디렉토리
#>set classpath=%classpath%;C:\SOO\Java\day11\classes
#>javac AUser.java
#>java AUser
<2> jar
#>set classpath=%classpath%;C:\SOO\Java\day11\jar\p.jar
#>javac AUser.java
#>java AUser
3) 환경변수 법 ( 유효범위: OS )
<1> 디렉토리
.;C:\SOO\Java\day11\classes
<2> jar
.;C:\SOO\Java\day11\jar\p.jar
cf1) build path ( in elipse )
cf2) javadoc -d ./doc *.java
ex) day12/A.java, AChild.java, AUser.java
(1) 공통점
- 추상메소드를 가질 수 있음
- 완벽한 자식객체를 생성해서 형변환
(2) 차이점
- 클래스이고 인터페이스 근본 특성
- 추상클래스는 일반메소드와 일반멤버변수와 생성자를 가질 수 있음
(1) 예외( Exception )
프로그램이 정상적으로 진행되지 못하게 하는 '돌발 상황'
ex) 숫자가 아닌 형태의 문자를 숫자로 바꾸려할 때
채팅하나가 상대방이 나가버린 경우
온라인 게임하고 있는 데
- 게임서버가 다운된 경우
- 전원케이블이 빠짐
- 번개가 쳐서 집안 전기 끊김
(2) 예외처리목적
프로그램 진행시 발생할 수 있는 '돌발상황'을 예외로 '미리 정해놓고',
해당하는 예외가 발생했을 경우 적절한 조치를 취해서,
프로그램이 '정상적으로 작동'하도록 하는 것
(3) 계층도
Object
|
Throwable
| |
Error Exception
| |
CompileException RuntimeException
CheckedException
ex) day13/A.java
(4) 특징
1) throw 로 예외를 발생시킴
2) throws 로 예외발생가능성을 표식할 수 있음 ( == 떠넘길 수 있음 )
3) try catch 로 잡을 수 있음 ( == 적극적으로 때려 잡음 )
4) '생성자'나 '메소드'에서만 발생할 수 있음
5) 상위 Exception 으로도 처리가 가능
(5) 처리방법( ***** )
1) 때려 잡는 법
try{
예외발생구문(생성자 or 메소드)
}catch(예외타입 예외객체){
처리 로직
}
2) 떠넘기는 법
throws 예외타입
(6) try절안에 2개 이상의 예외 발생
1) 예외들이 상속관계O
[순서존재O] 하위예외부터 잡아 줌
catch(MyException me)
catch(Exception e)
2) 상속관계X
[순서존재X] 아무예외나 먼저 잡아주면 됨
catch(MyException me)
catch(YourException ye)
ex) day13/B.java
(7) 2이상의 예외를 떠넘길 때
(ex: throws MyException, YourException, ... )
ex) day13/C.java
(8) finally절
1) 항상 수행되는 절
( 심지어.. return 을 만나더라도 수행하고 리턴 됨 )
2) try절이 나오면..
catch절이 나오거나, finally절이 나오거나,
아니면.. 둘다 나오거나 해야 함
3) 얘는 못이김
System.exit(-1); //비정상종료
System.exit(0); //정상종료
ex) day13/D.java
클래스안의 클래스
(1) 객체 생성 방법
1) 외클.내클 변수 = new 외클().new 내클();
2) 외클.내클 변수 = new 외클.내클();
ex) day14/A.java
(2) main 위치
1) 제3클래스나 외부클래스에 있을 때는 동일하게 사용 가능
2) static 내부클래스에서만 main을 정의할 수 있음
( 이유: static 내부클래스에서만 static 자원(멤버/메소드)을 정의할 있음 )
3) static 내부클래스에서는 외부클래스의 static 자원만 접근 가능
ex) day14/A.java
(3) 쓰는 이유
외부클래스의 자원(private 포함)을 '자기 것'처럼 사용하기 위해서
ex) day14/B.java
프로세스를 구성하는 '제어의 흐름'
(1) Process 와 Thread
1) Process : 프로그램 '실행 단위'
2) Thread : Process 를 구성하는 '작업 단위'
(2) 장점
쓰레드 '경량 프로세스'라고 불림
이유는 프로세스의 공통 Resource 를 공유하기 때문임
(3) 생성법
1) java.lang.Thread 상속법
2) java.lang.Runnable 상속법
ex) day14/C.java
(4) 시작
쓰레드객체.start();
(5) 비유: '피고용인'( Emploee )
ex) day14/D.java
(6) LifeCycle
1) 5가지 상태
2) 각 상태는 '메세드'나 '스케쥴러'나 '시간'에 의해 이동함
3) 한번 죽으면 살아나지 못함
(7) Priority
1) Ready 상태의 쓰레드 중에서
우선적으로 CPU를 점율할 수 있는 쓰레드를 판별하기 위한 LEVEL값
2) 범위
1 ~ 10
3) 상수
MAX_PRIORITY : 10
MIN_PRIORITY : 1
NORM_PRIORITY : 5
ex) day14/E.java
(8) 동기화
1) 비유 : 화장실의 문꼬리
2) 하나 이상의 쓰레드가 어떤 연산 or 로직에 동시에 접근했을 때,
그 연산에 대한 값의 무결성을 보장하기 위해서 수행 영역에 대한
lock을 걸어주는 것
3) 예
static int i = 0;
i++;
# CPU의 연산 단계 #
<1> 현재 i값을 읽음 i==0 i==0
<2> i값을 증가 i==0 i==0
<3> 증가된 i값을 i에 저장 i==1 i==1
4) 방법
1) synchronized void m(){
동기화가 필요한 로직;
}
2) synchronized(this){
동기화가 필요한 로직;
}
ex) day14/F.java
스트림( Stream ): '데이터의 흐름'
Data Source(근원지) --> Data Destination (목적지)
스트림 특징
1) FIFO ( First In First Out )
2) 지연성
3) 단방향성
4) 유연성
표준입력 / 표준출력
키보드( System.in ) ---------> 모니터( System.out )
구분
1) 전송단위
<1> 바이트 스트림 ( 1 byte stream )
ex: XXXStream
<2> 문자 스트림 ( 2 byte stream )
ex: XXXReader, XXXWriter
2) 특성
<1> 근본 스트림(node stream)
<2> 다리 스트림(bridge stream)
InputStreamReader , OutputStreamWriter
<3> 목적(==응용) 스트림(filter stream)
ex) day15/A.java
3) 입출력
<1> 입력 스트림
ex: XXXInputStream, XXXReader
<2> 출력 스트림
ex: XXXOutputStream, XXXWriter
주요 스트림 클래스
1) InputStream / OutputStream
2) Reader / Writer
3) FileInputStream / FileOutputStream
4) FileReader / FileWriter
5) InputStreamReader / OutputStreamWriter
6) BufferedInputStream / BufferedOutputStream
7) BufferedReader / PrintWriter
8) DataInputStream / DataOutputStream
9) ByteArrayInputStream / ByteArrayOutputStream
10) CharArrayReader / CharArrayWriter
11) ObjectInputStream / ObjectOutputStream
ex) day15/C.java
cf) java.io.File => '디렉토리'와 '파일'을 모델링한 클래스
ex) day15/D.java