|
|
2장 변수와 타입
-변수
변수 : 변수란 하나의 값을 저장할수있는 메모리 공간
변수의 선언
변수의 데이터 타입 지정 변수의 이름
ex) int score;
-데이터 타입
ㆍ정수타입
ㄴ byte - (-128~127)
char - (각 문자가 가진 유니코드값)
short - (-32,768~32,767)
int - (-2^31~2^31-1)
long - (-2^63~2^63-1)
ㆍ실수
ㄴ float - (+/- 1.4E-45 ~ +/- 1.7E38)
double - (+/- 4.9E-324 ~ +/- 1.7E308)
ㆍ논리
boolean - (true / false)
데이터 타입의 크기
byte, boolean< short,char < int < long < float < double
-타입변환
데이터 타입을 다른 타입으로 변환하는것
byte -> int int -> double
묵시적 타입 변환은 Promotion 명시적 타입 변환은 Casting 연산이라고 함
Promotion : 프로그램 실행도중 작은 타입은 큰 타입으로 자동 변환 되는것
서로 같은 타입의 피연산자 간에만 수행
(큰 타입안에 작은 타입의 값이 범위에 포함되어있어 굳이 명시 하지않아도 가능)
Casting 연산: 큰 타입을 작은 타입의 단위로 억지로 쪼개는것. 끝의 한 부분만 작은 타입으로 강제적 변환
(ex : 더블 타입 70.526을 인트타입 70으로 만들기)
3장 연산자
- 연산자와 연산식
ㆍ연산(Operations): 데이터를 처리하여 결과값을 내는것
ㆍ연산자(Operand): 연산에 사용되는 표시, 기호(+, -, *, /, %, =, ...)
ㆍ연산식(Expressions): 연산자와 피연산자로 연산의 과정을 기술한것
- 연산의 방향과 순위
단항 연산자(++,--,~), 부호 연산자(+, -), 대입 연산자(=,+=,-=, ...), 논리(!)는
오른쪽에서 왼쪽
산술(*,/,%), 쉬프트(<<, >>, >>>), 비교(<, >, <=, >=,instanceof, ==, !== ),
논리(&, ^, |, &&, ||), 조건(?:)은 왼쪽에서 오른쪽
- 단항 연산자
단항연산자: 피연산자가 1개인 연산자
종류
ㆍ 부호 연산자: +,-(boolean,char타입 제외한 기본타입 사용가능) 산출타입: int
ㆍ 증감 연산자: ++, -- (변수값을 1씩 증가,감소시키는 연산자. 증감 연산자가
변수뒤에 있으면 다른 연산자 처리후 증감연산자 처리)
ㆍ논리부정 연산자: ! 피연산자가 true면 false, false면 true로 산출
ㆍ비트반전연산자: byte, short, int, long타입만 피연산자가 될수있음
비트값을 반전 시킨다.(0 1 -> 1 0)
- 이항 연산자
이항연산자: 피연산자가 2개인 연산자
종류
ㆍ산술 연산자:(+,-,*,/,%)
boolean 타입을 제외한 모든 기본타입 사용가능
결과값 산출할때 Overflow 주의
정확한 계산은 정수를 사용
NaN과 Infinity 연산은 주의할것
ㆍ문자열 연산자:(int+"") 피연산자 중 문자열이 있으면 문자열로 결합
ㆍ대입연산자:(=, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>=, >>>= )
오른쪽 피연산자의 값을 좌측 피연산자의 변수에 저장
모든 연산자들 중 가장 낮은 연산 순위 -> 제일 마지막에 수행
단순대입/복합대입
ㆍ비교연산자: (==, !=, <, >, <=, >=)
대소여부, 또는 동등여부를 비교해
boolean타입인 true/false로 산출
ㆍ논리연산자: (&&, ||, &, |, ^, !)
논리곱, 논리합, 배타적 논리합, 논리부정의 연산수행
피연산자는 boolean 타입만 사용가능
ㆍ비트논리연산자:(&,|,^,~)
피 연산자가 boolean 타입일 경우 일반 논리 연산자
피연산자가 정수 타입일 경우 비트 논리 연산자로 사용
비트 연산자는 피연산자를 int타입으로 자동 타입 변환 후 연산수행
ㆍ비트이동연산자:(<<, >>, >>>)
정수 데이터의 비트를 좌측 또는 우측으로 밀어 이동시키는 연산수행
- 삼항 연산자(? :)
삼항 연산자: 세 개의 피연산자를 필요로 하는 연산자
앞의 조건식 결과에 따라 콜론 앞 뒤의 피연산자 선택 -> 조건연산식(if문)
-------------------------------3장 코딩 이미지-------------------------------------------------
4장 조건문과 반복문
- 코드 실행 흐름 제어
ㆍmain() 메소드의 시작인 중괄호, { 에서 끝인 중괄호, } 까지 위에서 아래방향으로 실행
ㆍ제어문을 사용해 코드의 실행 흐름을 원하는 방향으로 조정할수있다.
ㆍ제어문의 중괄호 내부에 다른 제어문 작성 가능
ㆍ제어문 종류: 조건문,반복문, break,continue문
- 조건문(if문, switch문)
조건문 - 조건을 걸어 해당 조건에 부합하는지 여부를 확인해 결과를 달리 할수있는 제어문
ㆍif문: true,false값을 산출할 수 있는 연산식
boolean 변수를 사용해 true면 블록을 실행하고 false면 블록을 실행하지않음
if else를 사용해 복수의 조건식을 추가 가능
if 문을 중첩해 조건1이 true인 경우 조건 2가 true인지 여부 확인 가능
ㆍswitch문: 변수나 연산식의 값에 따라 실행문을 각각 선택할때 사용
값이 1일때 결과 1, 값이 2일 경우 결과 2 와 같은 형태로 사용
- 반복문(for문, while문, do-while문)
반복문 - 중괄호 블록 내부의 내용을 일정 조건을 만족하기 전까지 반복
ㆍfor문: 반복하는 횟수를 알고있을때 주로 사용.
for(초기화식; 조건식; 증감식;){실행문}; 의 형태로 사용
조건식이 true일 경우 실행문을 반복.
(변수가 가진 조건이 true일때 변수를 1증가 후 실행문을 한번 반복해라false가 되면 종료)
ㆍwhile문: 조건에 따라 반복을 계속할지 결정할때 사용
while(조건식){실행문;} 의 형태로 사용.
조건식이 false일 경우 종료.
(변수 조건식이 true일 경우 실행문을 실행하라.false가 되면 종료)
ㆍdo-while문: 조건에 따라 반복을 계속할지 결정하는 것은 while문과 동일
무조건 중괄호{} 블록을 한번 실행한 이후, 조건을 검사해 반복을 결정
do{실행문;}while(조건식);
(하라 실행문을 조건식이 true라면 계속. false가 되면 종료)
ㆍbreak문: for, while, do-while문의 반복을 종료, Switch문 종료
대개 if문과 같이 사용, if문 조건식에 따라 for문과 while문 종료할때 사용
반복문이 중첩된 경우 가장 가까운 반복문만 종료.
ㆍcontinue문: for, while, do-while문에서 사용됨
for문- 증감식으로 이동 / while문, do-while문- 조건식으로 이동
-------------------------------4장 코딩 이미지-------------------------------------------------
5장 참조 타입
- 데이터 타입 분류
ㆍ데이터 타입
기본 타입 (정수타입: byte, char, short, int, long),(실수타입: float, double),(논리타입: boolean)
참조 타입 (배열타입, 열거타입, 클래스, 인터페이스)
ㆍ변수의 메모리 사용
기본 타입 변수 - 실제 값을 변수의 안에 저장함(실질적인 숫자나 정보)
참조 타입 변수 - 주소를 통해 객체 참조(일종의 링크)
- 메모리 사용 영역
JVM이 사용하는 메모리 영역(OS에서 할당받은 메모리영역Runtime DataArea를 세 영역으로 구분)
ㆍ메소드 영역
JVM 시작할 때 생성
로딩된 클래스 바이트 코드 내용을 분석후 저장함
모든 스레드가 공유하는 영역
ㆍ힙 영역
JVM 시작할 때 생성
객체/배열을 저장함
사용되지 않는 객체는 Garbage Collecter가 자동으로 제거
ㆍJVM스택
스레드 별 생성
메소드를 호출할 때 마다 Frame을 스택에 추가
메소드를 종료하면 Frame제거
- 참조 변수의 ==,!= 연산
변수의 값이 같은지 다른지를 비교
ㆍ기본 타입: (byte, char, short, int, long, float, double, boolean) 변수의 값이 같은지 조사
ㆍ참조 타입:(배열, 열거, 클래스, 인터페이스) 동일한 객체를 참조하는지 다른 객체를 참조하는지 조사
- null과 NullPointerException
ㆍnull(널)
변수가 참조하는 객체가 없을 경우 초기값으로 사용가능
참조 타입의 변수에만 저장 가능
null로 초기화된 참조 변수는 스택 영역 생성
==, !=연산 가능
ㆍNullPointerException
예외(Exception) - 사용자의 잘못된 조작이나 잘못된 코딩으로 인해 발생하는 프로그램 오류
NullPointerException - 참조변수가 null값을 갖고 있을 때 객체의 필드와 메소드를 사용하려하면 발생
- String 타입
String 타입 : 문자열을 저장하는 클래스 타입
ㆍ문자열 리터럴이 동일하면 String 객체 공유
ㆍnew 연산자를 이용한 객체 생성
힙 영역에 새로운 객체 생성
객체 생성후 번지를 리턴
- 배열 타입
배열 : 같은 타입의 데이터를 연속된 공간에 저장하는 자료구조, 각 데이터 저장 위치는 인덱스를 부여해 접근
ㆍ배열의 장점 - 중복된 변수선언을 줄일수있고 반복문을 이용해 요소를 간단히 처리할수있음
배열의 선언 ) 배열을 사용하기 위해 우선 배열 변수를 선언해야한다.
타입[] 변수; , 타입 변수[]; 로 선언할수있다.
ㆍ값 목록으로 배열을 생성하는 방법
변수 선언과 동시에 값 목록 대입 ->데이터타입[] 변수 = {값1, 값2, 값3, ...};
변수 선언후 값 목록 대입 -> 데이터타입 변수;
변수 = new타입[]{값1, 값2, 값3, ...};
ㆍnew 연산자로 배열 생성
배열 생성시 값 목록을 가지고 있지 않아서 나중에 값들을 저장할 배열을 미리 만들고 싶을 때 사용
타입[] 변수 = new 타입 [길이];
ㆍ배열의 길이
배열에 저장할수있는 전체 항목 수, 코드에서 배열의 길이를
배열변수명.length;
int[] intArray = {10, 20, 30};
int num = intArray.length;
로 얻을 수 있으며 배열의 길이는 읽기 전용이다. 그리고 for문의 조건식으로 주로 사용한다.
ㆍ다차원 배열
2차원 배열 이상의 배열로 수학의 행렬과 같은 자료구조이다. 자바는
1차원 배열을 이용해 2차원 배열을 구현한다.
ㆍ객체를 참조하는 배열
기본타입과 참조타입이 있음 기본타입은(byte, char, short, int, long, float, double, boolean) 각
항목에 직접 값을 가지고 있고, 참조타입(클래스, 인터페이스)배열은 각 항목에 객체의 번지를 가진다.
ㆍ배열 복사
배열은 한 번 생성하면 크기 변경이 불가능하다. 그래서 더 많은 저장 공간이 필요하면 보다 큰 배열을
새로 생성하고 이전의 배열로부터 객체를 복사하는 방식을 사용한다. 사용하는 방식으로는 for문을
이용하는것, System.arrayCopy() 메소드를 이용하는것, 그리고 Arrays 클래스를 이용하는법이 있다.
※ 향상된 for문
배열 및 컬렉션의 항목 요소를 순차적으로 처리하고 인덱스를 이용하지 않고 항목 요소를 반복한다.
ㆍ이전의 for문 ㆍ향상된 for문
for(초기화식; 조건식; 증감식;){실행문}; for(타입변수; 배열;){실행문};
- 열거 타입
열거 타입: 한정된 값만을 갖는 데이터 타입으로 한정된 값은 열거(Enumeration Constant) 상수로 정의한다.
열거 타입 선언) 파일 이름과 동일한 이름으로 다음과 같이 선언한다 : public enum 열거타입이름{ . . . }
한정된 값인 열거 상수를 정의
ㄴ 열거 상수 이름은 관례적으로 모두 대문자, 다른 단어가 결합되면
관례적으로 밑줄로( _ ) 연결
ㆍ열거타입 변수
열거 타입 변수 선언 : Week today;
Week reservationDay;
열거 상수 값 저장(열거 타입 변수값은 열거 상수중 하나다)
: 열거 타입 변수 = 열거 타입.열거상수;
Week today = Week.SUNDAY;
열거타입의 변수는 참조 타입이다. 그러므로 null값 저장이 가능함.
Week birthday = null;
ㆍ열거 객체의 메소드
열거 객체는 열거 상수의 문자열을 내부 데이터로 가지고 있다.
열거 타입은 컴파일 할때 java.lang.Enum 클래스를 자동으로 상속 받는데,
열거 객체는 그래서 java.lang.Enum 클래스의 메소드를 사용 가능하다.
-------------------------------5장 코딩 이미지-------------------------------------------------
6장 클래스
- 객체 지향 프로그래밍
OOP(Object Oriented Programming) : 부품 객체를 먼저 만들어 그 부품들을 하나씩 조립해 완성하는 기법
객체(Object) : 물리적으로 존재하는것(자동차,사람, 책, 컴퓨터)
추상적인 것(회사, 날짜, 시간) 중에 자신의 속성과 동작을 가지는 것
객체는 필드(속성)과 메소드(동작)으로 구성된 자바의 객체로 모델링
이 가능하다.
ㆍ객체의 상호작용
객체 끼리는 서로간에 기능을 이용하고 데이터를 주고 받는데 이런 관계성의 종류는
집합관계(커다란 완성품 객체안에 존재하는 부품객체 ex: 자전거와 바퀴)
사용관계(객체가 다른 객체를 사용 ex: 사람과 자전거)
상속관계(부모 객체가 가진 능력을 자식이 물려받음 ex: 자전거와 세발 자전거) 로 나뉜다.
ㆍ객체 지향 프로그래밍의 특징
-캡슐화 : 객체의 필드와 메소드를 하나로 묶어 실제 구현 내용을 감추는것으로
외부 객체가 내부 구조를 알지 못하게 하여 외부의 잘못된 사용으로 객체가 손상되는
것을 막는다. 자바언어는 캡슐화된 멤버의 노출정도를 결정하기 위해 접근 제한자를
사용하여 객체가 제공하는 정보만 외부에서 사용할수있게 함
-상속 : 상위(부모)객체의 필드와 메소드를 하위(자식)객체에게 물려주는 행위로 자식객체는
부모객체가 가진 속성을 물려받으면서 동시에 자신만의 추가적인 필드와 메소드를
가진다. 상속의 대상은 필드와 메소드가 있고 상속의 효과로는 객체의 재사용으로
빠르게 하위 객체를 만들수있고 코드의 중복을 방지하며 유지보수의 편리성과 객체의
다형성을 구현한다.
-다형성 : 같은 타입이라도 실행의 결과가 다양한 객체를 대입할 수 있는 성질이다.
부모의 타입에는 모든 자식 객체가 대입되고 인터페이스 타입엔 모든 구현객체가 대입
된다. 그 효과로는 객체를 부품화시킬수있고 유지와 보수에 용이하다
- 객체(Object)와 클래스(Class)
클래스: 클래스는 객체를 찍어내는 설계도 또는 틀과 같은것이다. 클래스는 클래스의 멤버로 속성을
표현하는 필드(field)와 기능을 표현하는 메소드(method)를 가지는데 생성된 객체를 초기화
해주는 특별한 메소드인 생성자(constructor)를 가진다. 그리고 이 클래스로부터 만들어진
객체를 해당 클래스의 인스턴스(instance)라고 부르며 하나의 클래스로 대량생산이 가능하다.
- 클래스 선언
ㆍ클래스 선언과 컴파일
소스파일생성은 ClassName.java 의 형식으로 작성되어야한다.
소스를 작성하는 방법은 public class ClassName{ 내용물 } 로 컴파일 하면 ClassName.class 다
소스 파일당 하나의 클래스를 선언하는 것이 관례다. 하지만 둘 이상의 클래스도 선언이 가능함
소스 파일의 이름과 동일한 클래스만 public으로 선언이 가능하다. 선언한 개수만큼 바이트 코드
파일이 생성된다.
- 객체 생성과 클래스 변수
ㆍnew 연산자
new 연산자는 객체를 생성하는 역할을 한다. 클래스()는 생성자를 호출하는 코드로 생성된
객체는 힙(heep)메모리 영역에 생성된다. new연산자는 객체를 생성한 후 객체 생성번지를
리턴한다.
ㆍ클래스 변수
클래스 변수는 new 연산자에 의해 리턴된 객체의 번지를 저장한다 (참조 타입 변수)
힙 영역에 생성된 객체를 사용하기 위해 쓴다.
ㆍ클래스의 용도
-라이브러리(API: Application Program Interface)용 클래스
자체적으로 생성되지 않고 다른 클래스에서 이용할 목적으로 만들어진 클래스
-실행용 클래스
main()메소드를 가진 클래스로 실행할 목적으로 만들어진 클래스
1개의 어플리케이션 = 1개의 실행클래스 + n개의 라이브러리 클래스
- 클래스의 구성 멤버
public class ClassName{//클래스 선언 (머리)
ㆍ필드 : 객체의 데이터가 저장될 장소 -----------------> //필드
int fieldName;
ㆍ생성자 : 객체를 생성시 초기화 역할 -----------------> //생성자
ClassName(){ . . . }
ㆍ메소드 : 객체의 동작에 해당하는 실행블록 -----------> //메소드
void methodName(){ . . . }
}//클래스마무리 (꼬리)
- 필드(Field)
ㆍ필드의 내용
객체의 고유 데이터 ex) String company; String model; String color; int maxSpeed;
객체의 현재 상태 데이터 ex) int speed; int rpm;
객체가 가져야 할 부품 객체 ex) Body body; Engine engine; Tire tire;
ㆍ필드의 선언
타입 필드 = 초기값; ex) String company = "현대자동차"; / int maxSpeed = 300;
ㆍ필드의 기본 초기값
초기값은 필드의 타입에 따라 정해지며 초기값이 지정되지 않은 필드는 객체를 생성할떄
자동으로 초기값을 초기화 한다. ex) String > null / boolean > false / int > 0 / long > 0L
ㆍ필드 사용
필드 값을 읽고 변경하는 작업을 말한다.
필드의 사용 위치는 객체 내부에서는 "필드 이름"으로 접근하고 외부에서는 "변수.필드이름"
으로 접근한다.
- 생성자(Constructor)
객체의 초기화를 담당한다. 필드의 값을 설정한 이후 메소드를 호출해 객체를 사용할 준비를 하는 역할.
ㆍ기본생성자(Default Constructor)
모든 클래스에 생성자는 필수로 있고 하나 이상 가질수있다. 생성자 선언을 생략하면
컴파일러는 기본생성자를 자동으로 추가해준다.
ㆍ생성자 선언
디폴트 생성자 대신 개발자가 직접 선언하는데 개발자가 선언한 생성자가 존재하면
컴파일러는 기본 생성자를 추가해주지 않음. new 연산자로 객체를 생성하면
개발자가 선언한 생성자를 반드시 사용한다.
ㆍ필드 초기화
초기값 없이 선언된 필드는 객체 생성시 자동생성된다. 다른값으로 필드를 초기화 하려면
필드를 선언할때 초기값을 설정한다. 그리고 매개변수와 필드명이 같으면 this를 사용한다.
ㆍ생성자를 다양화해야하는 이유
객체를 생성할때 외부 값으로 객체를 초기화할 필요가 있고 외부의 값이 어떤 타입으로 얼마나
제공 될 지 알 수 없기 떄문이다.
ㆍ생성자 오버로딩(Overloading) : 안에 든 매개변수가 타입 갯수 순서가 다른 생성자를 여럿 선언한다.
ㆍ다른 생성자를 호출(this())
생성자가 오버로딩 되면 생성자 간의 중복된 코드가 발생할수있기 때문에 초기화 내용을 한 생성자에
몰아서 작성하고 다른 생성자는 초기화 내용울 작성한 생성자를 this( . . . )로 호출한다.
- 메소드(Method)
ㆍ객체의 동작(기능)
호출해서 실행할 수 있는 중괄호 { } 블록
메소드를 호출하면 중괄호 { } 블록에 있는 모든 코드들이 한번에 실행된다.
ㆍ메소드 선언
리턴타입 메소드명 ([매개변수 선언, ...]){메소드 실행 블록}
ㆍ메소드 리턴 타입
메소드가 실행된 이후 리턴되는 값의 타입. 메소드는 리턴 값이 있을수도 없을수도 있다.
[메소드 선언] [메소드 호출]
void powerOn(){ . . . } powerOn();
double divide(int x, int y){ . . . } double result = divide(10, 20);
ㆍ메소드의 매개변수선언
메소드를 실행할 때 필요한 데이터를 외부에서 받기 위해 사용하나, 매개변수가
필요 없을때도 있음
ㆍreturn문
메소드 실행을 중지하고 리턴값을 지정하는 역할을 한다. 리턴값이 있는 메소드는 반드시
리턴문을 이용해 리턴값을 지정해야 하고 리턴값이 없는 메소드는 메소드 실행을 강제 종료
시키는 역할을 한다. 또한 리턴문의 앞이 아니라 뒤에는 실행문이 와서는 안된다.
ㆍ메소드 호출
메소드는 클래스 내,외부의 호출에 의해 실행되는데 클래스의 내부에서는 메소드명으로
외부에서는 객체를 생성하여 참조변수를 사용해 호출한다.
ㆍ메소드 오버로딩(Overloading)
클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것으로 하나의 메소드 이름으로
다양한 매개값을 받기 위해 메소드 오버로딩을 사용한다. 오버로딩의 조건으로는
매개변수의 타입, 개수, 순서 이중에 하나라도 달라야만 한다.
- 인스턴스 멤버와 this
인스턴스 멤버 : 객체(인스턴스)마다 가지고 있는 필드와 메소드를 말한다. 이들을 각각 인스턴스 필드
인스턴스 메소드라고 하는데, 이들은 객체에 소속되어있기에 객체가 없이 사용될수는없다.
this : 객체(인스턴스) 자신의 참조(번지)를 가진 키워드를 말하며, 객체의 내부에서 인스턴스 멤버임을
명확히 하기 위해 this.xx를 사용한다. 또한 매개변수와 필드명이 동일한 경우에 인스턴스 필드임을
명확히 하기위해 사용된다.
- 정적 멤버와 static
정적(static)멤버 : 클래스에 고정된 필드와 메소드중의 하나로 정적필드와 정적메소드라고 호칭한다.
인스턴스 멤버는 객체에, 정적 멤버는 클래스에 고정되어 쓰이는 친구들이다.
그렇기 때문에 정적 멤버는 객체 내부에 존재하지 않고, 메소드 영역에 존재한다.
또한 정적멤버는 객체를 생성하지 않고 클래스에 바로 접근하여 사용한다.
ㆍ정적멤버 선언
필드 또는 메소드를 선언할때 static키워드를 붙인다.
ㆍ정적멤버 사용
클래스의 이름과 함께 도트 연산자( . )로 접근한다.
클래스.필드;
클래스.메소드(매개값);
ㆍ인스턴스 멤버 선언 vs 정적 멤버 선언의 기준
필드 - 객체마다 가지고 있어야 할 데이터:인스턴스 필드 / 공용데이터 : 정적 필드
메소드- 인스턴스 필드로 작업해야할 메소드 : 인스턴스메소드
인스턴스 필드로 작업 하지 않는 메소드 : 정적메소드
ㆍ정적 초기화 블록
클래스가 메소드 영역으로 로딩될때 자동으로 실행하는 블록이다. 정적 필드의 복잡한
초기화 작업과 정적 메소드를 호출할수있다. 클래스의 내부에 여러 초기화 블록이
선언되었다면 선언된 순서대로 순차적으로 실행된다. static{ . . . }
ㆍ정적 메소드와 정적 블록 작성시 주의할 점
객체가 없어도 실행이 가능하다. 블록의 내부에 인스턴스 필드나 인스턴스 메소드 사용 불가
객체 자신의 참조인 this 사용 불가
ㆍ싱글톤
하나의 애플리케이션 내에서 단 하나만 생성되는 객체를 싱글톤이라고 한다.
싱글톤을 생성하려면 외부에서 new연산자로 생성자를 호출할수 없도록
앞에 접근제한을 private으로 생성자 앞에 붙여준다. 그리고 클래스 자신의 타입으로
정적 필드를 선언해 자신의 객체를 생성해 초기화한다. 그리고 그 앞에도 private접근 제한자를
붙여 외부에서 필드의 값을 변경할수없게 막는다(overriding못하게) 그리고 외부에서 호출할땐
정적 메소드인 getInstance()를 선언해서 정적 필드에서 참조하고 있는 자신의 객체를 리턴한다
싱글톤을 얻는 방법
클래스 변수1 = 클래스.getInstance();
클래스 변수2 = 클래스.getInstance();
- final 필드와 상수(static final)
final 필드는 최종적인 값을 갖고있는 필드로 값을 변경할수없는 필드이다.
필드를 선언할때 필드 내부의 값들 앞에 final을 붙여준다.
public class Person{
final String nation ="한국";
final String ssn;
String name;
public Person(String ssn, String name){
this.ssn = ssn;
this.name = name;
}
}
ㆍ상수(static final)
상수 = 정적 final 필드 (static final field)
final필드는 객체마다 가지지않고, 메소드 영역에 클래스 별로 관리되는 불변의 정적필드이다.
그렇기 때문에 공용데이트로서 사용된다. 상수의 이름은 전부 대문자로 작성해야하고 다른
단어와의 결합이 있다면 띄어쓰기 대신 _ 로 연결한다.
- 패키지(package)
패키지는 클래스를 기능별로 묶어 그룹의 이름을 붙여둔 것으로 파일들을 관리하기 위해 사용하는
폴더와 유사한 개념이라고 볼수있다. 패키지의 물리적인 형태는 그렇기에 파일 시스템의 폴더이다.
ㆍ클래스 이름의 일부
클래스를 유일하게 만들어주는 식별자이다. 전체 클래스의 이름은 상위패키지.하위패키지.클래스
의 형식을 따르고 클래스의 이름이 같아도 패키지의 이름이 다르면 다른 클래스로 취급된다.
ex) 자동차라는 패키지 안의 바퀴라는 클래스와 자전거라는 패키지 안의 바퀴라는 클래스는
내용은 완벽하게 동일하게 앞으로 굴러가는 속성의 필드와 메소드를 갖췄지만 패키지가
다르므로 다른 클래스로 취급
그렇기 때문에 클래스를 선언할때엔 반드시 패키지 선언을 포함해야하며 클래스의 파일(~.class)
은 선언된 패키지와 동일한 폴더 안에 있을때에만 동작한다. 다른 폴더 안에 있으면 동작하지
않는다.
ㆍimport문
패키지 내에 같이 포함된 클래스간 클래스의 이름으로 사용이 가능하다.
패키지가 다른 클래스를 사용해야 할 경우 패키지명이 포함된 전체 클래스 이름으로 사용하거나
Import문으로 패키지를 지정하고 사용한다.
- 접근 제한자
접근제한자(Access Modifier): 클래스 및 클래스의 구성 멤버에 대한 접근을 제한하는 역할을 한다.
다른 패키지에서 클래스를 사용하지 못하도록(클래스 제한)
클래스로부터 객체를 생성하지 못하도록(생성자 제한)
특정 필드와 메소드를 숨김 처리 (필드와 메소드 제한)
public(공공용)>protected(상속관계에 있거나 동패키지 내 가능 )>default(동패키지용)>private(개인용)
- Getter와 Setter
클래스 선언할 때 필드는 일반적으로 private 접근 제한을 사용한다.
제한 된 정보를 읽어내기 위한 읽기 전용 필드가 있고 (Getter)
외부에서 엉뚱한 값으로 변경할 수 없도록 한다. (Setter의 필요성)
ㆍGetter
private 필드의 값을 리턴 하는 역할 - 필요할 경우 필드의 값을 가공
getFieldName() 또는 isFieldName() 메소드를 사용한다.
이때 필드 타입이 boolean 일 경우 isFieldName()을 사용한다.
ㆍSetter
외부에서 주어진 값을 필드 값으로 수정한다
필요할 경우 외부의 값을 유효성 검사를 한 후
setFieldName(타입 변수) 메소드를 사용한다.
이때 매개 변수 타입은 필드의 타입과 동일
- 어노테이션(Annotation)
어노테이션은 프로그램에게 추가적인 정보를 제공해주는 메타데이터(metadata)를 말한다.
컴파일러에게 코드 작성 문법 에러 체크하도록 정보 제공하거나 소프트웨어 개발 툴이
빌드나 배치 시 코드를 자동 생성할수있도록 정보 제공, 또는 실행 시(런타임시) 특정 기능
실행하도록 정보를 제공하는 역할을 한다.
ㆍ어노테이션 타입 정의와 적용
정의 - 소스 파일을 생성한다. [ AnnotatoinName.java ] 그 내용은
public @interface AnnotationName{}
어노테이션 타입의적용은 @AnnotatoinName
ㆍ적용 대상 - (TYPE : 클래스, 인터페이스, 열거타입),(ANNOTATION_TYPE : 어노테이션), (FIELD : 필드),
(CONSTRUCTOR : 생성자),(METHOD:메소드),(LOCAL_VARIABLE : 로컬변수),(PACKAGE : 패키지)
-------------------------------6장 코딩 이미지-------------------------------------------------
7장 상속
- 상속 개념
상속은 객체 지향 프로그램에서 자식(하위,파생) 클래스가 부모(상위) 클래스의 멤버를 물려받는것이다.
자식이 부모를 선택해 물려받고 상속 대상은 부모의 필드와 메소드다.
ㆍ상속(Inheritance) 개념의 활용
효과: 부모 클래스 재사용해 자식 클래스를 빠르게 개발할수있다. 반복된 코드의 중복을 줄인다.
유지 보수의 편리성을 제공한다. 객체의 다형성을 구현 가능하다.
대상 제한: 부모 클래스의 private 접근을 갖는 필드와 메소드는 제외한다. 부모 클래스가 다른
패키지에 있을 경우, default 접근을 갖는 필드와 메소드도 제외한다.
- 클래스 상속(extends)
extends키워드 - 자식 클래스가 상속할 부모 클래스를 지정하는 키워드(자바는 단일 상속이라 나열은 불가)
사용법 : public class 자식 클래스명 extends 부모클래스명{}
- 부모 생성자 호출(super(…))
자식 객체를 생성하면 부모 객체도 생성이 될까?
부모 없는 자식은 없다고 자식이 아닌 부모 객체부터 생성한 후에 자식 객체를 생성해야 한다.
선택한 부모생성자를 호출 완료하면 자식 생성자 호출이 완료된다.
ㆍsuper(매개값,…)
매개값과 동일한 타입, 개수, 순서가 맞는 부모 생성자를 호출, 부모생성자가 없다면 컴파일
오류가 발생한다. 반드시 자식생성자의 첫줄에 위치해야 함. 부모클래스에 기본(매개변수x)
생성자가 없다면 반드시 작성할것.
- 메소드 재정의(Override)
@Override :부모 클래스의 상속받은 메소드를 수정해 자식 클래스에서 재정의하는 것이다.
ㆍ메소드 재정의 조건
부모 클래스의 메소드와 동일한 시그니처를 가져야한다. 접근 제한을 더 강하게 오버라이딩
하는것은 불가능하다(ex: public을 default, private으로 수정x, 반대로 default는 public으로 수정o )
새로운 예외(Exception) throws 불가
ㆍ@Override 어노테이션
컴파일러에게 부모 클래스의 메소드 선언부와 동일한지 검사를 지시한다.
정확한 메소드 재정의를 위해 붙여주는것
효과: 부모 메소드는 숨겨지고 재정의된 자식 메소드가 실행된다. 수정되기 전의 부모메소드를 호출하려면
super를 사용한다.
- final 클래스와 final 메소드
final 키워드의 용도
final 필드: 수정 불가 필드
final 클래스: 부모로 사용 불가한 클래스 (상속 불가)
final 메소드: 자식이 재정의할 수 없는 메소드 (오버라이딩 불가)
- protected 접근 제한자
상속과 관련된 접근 제한자이다. 같은 패키지 내부에서는 default와 다른것없이 사용되지만
다른패키지에서는 자식 클래스만 접근하여 사용이 가능하다.
- 타입변환과 다형성(polymorphism)
다형성 (Polymorphism): 같은 타입이지만 실행 결과가 다양한 객체 대입(이용) 가능한 성질을 말한다.
부모 타입에는 모든 자식 객체가 대입이 가능하지만 자식타입은 부모타입으로
자동으로 타입이 변환된다(Promotion). 그 효과로 객체를 부품화 할수있다.
바로 위의 부모가 아니더라도 상속 계층의 상위면 자동 타입이 변환된다. 변환
이후에는 부모 클래스 멤버만 접근 가능
ㆍ필드의 다형성
다형성을 구현하는 기술적인 방법이다. 부모타입으로 자동 변환되거나 오버라이딩한다.
ㆍ매개변수의 다형성
매개변수가 클래스 타입일 경우 해당 클래스의 객체 대입이 원칙이겠지만
자식 객체를 대입하는 것도 허용한다.
ㆍ강제 타입 변환(Casting연산)
부모 타입을 자식 타입으로 변환하는 것을 말하며 그 조건은 자식 타입을 부모 타입으로 자동 변환 후,
다시 자식 타입으로 변환할 때 사용된다. 강제 타입 변환이 필요할 때는 자식 타입이 부모
타입으로 자동 변환되었을 때, 부모 타입에 선언된 필드와 메소드만 사용 가능해지는 경우 또는
자식 타입에 선언된 필드와 메소드를 다시 사용해야 할 경우 사용한다.
ㆍ객체 타입 확인(instanceof)
부모 타입이면 모두 자식 타입으로 강제로 타입을 변환할 수 있는 것은 아니다. 잘못하면
ClassCastException이라는 예외가 발생이 가능하다. 먼저 자식 타입인지 확인 한 후에 강제
타입 실행해야 한다.
- 추상 클래스(Abstract Class)
추상 클래스(abstract class)는 실체 클래스들의 공통되는 필드와 메소드를 정의한 클래스이다.
추상 클래스는 실체 클래스의 부모 클래스 역할을 수행한다. (단독 객체 X)
ㆍ추상 클래스의 용도
실체 클래스의 공통된 필드와 메소드의 이름을 통일할 목적으로 쓰인다. 실체 클래스의 설계자가
여러 사람일 경우 실체 클래스마다 필드와 메소드가 제각기 다른 이름을 가질 수 있다. 또한
실체 클래스를 작성할 때 시간이 절약되고 실체 클래스 설계 규격을 만들고자 할 때에도 사용된다.
왜냐하면 실체 클래스는 추가적인 필드와 메소드만 선언하면 되고 실체 클래스가 가져야 할 필드와
메소드를 추상 클래스에 미리 정의하여 실체 클래스는 추상 클래스를 무조건 상속 받아 작성해야하기
떄문이다.
ㆍ추상 클래스 선언
클래스 선언에 abstract 키워드를 앞에 붙여 사용한다. New 연산자로 객체를 생성하지 못하고
상속을 통해 자식 클래스만 생성이 가능하다
ㆍ추상 메소드와 오버라이딩(재정의)
메소드의 이름은 동일하지만, 실행 내용이 실체 클래스마다 다른 메소드
예: 인간은 언어로 소통한다. 하지만 대화할때 사용하는 언어는 제각각이다.
구현방법: 추상 클래스에는 메소드의 선언부만 작성한다 (추상 메소드)
실체 클래스에서 메소드의 실행 내용을 작성(오버라이딩(Overriding))
-------------------------------7장 코딩 이미지-------------------------------------------------
8장 인터페이스
- 인터페이스의 역할
인터페이스는 개발의 코드와 객체가 서로 통신하는 접점이다. 개발의 코드는 인터페이스의 메소드만 알고
있으면 된다. 인터페이스는 개발 코드가 객체에 종속되지 않게, 문제가 생기면 객체를 교체할수있도록 하는
역할을 하고 또한 개발코드 변경 없이 리턴값 또는 실행 내용이 다양해 질 수 있도록 한다.
- 인터페이스 선언
인터페이스 이름 - 자바 식별자 작성 규칙에 따라 작성하는데, 소스파일을 생성할때 인터페이스의
이름과 대소문자가 동일한 소스 파일을 생성한 후 [public] interface 인터페이스 명{}
으로 인터페이스를 선언한다.
ㆍ구성멤버 - 인터페이스 명, 상수, 추상메소드, 디폴트 메소드, 정적 메소드
ㆍ상수 필드 선언
인터페이스는 상수 필드만 선언 가능하다. 데이터를 저장할수없다.
인터페이스에 선언된 필드는 모두 public static final이 자동으로 컴파일 과정에서 붙는다.
상수명은 대문자로 작성해야한다. 서로 다른 단어로 구성되었다면 _로 연결한다.
선언과 동시에 초기값이 지정되는데, static { } 블록을 작성 불가할수없다( static {} 으로 초기화 불가)
ㆍ추상 메소드 선언
인터페이스를 통해 호출된 메소드는 최종적으로 객체에서 실행되는데 이때
인터페이스의 메소드는 기본적으로 실행 블록이 없는 추상 메소드로 선언한다.
public abstract는 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다.
[public abstract] 리턴타입 메소드명(매개변수, ...);
ㆍ디폴트 메소드 선언
자바8에서 추가된 인터페이스의 새로운 멤버이다. 실행블록을 가진 메소드이고 반드시
default키워드를 붙여야한다. 기본적으로는 public접근제한이다. 생략하더라도 컴파일
과정에서 자동으로 붙는다.
ㆍ정적 메소드 선언
이 역시 자바8에서 추가된 인터페이스의 새로운 멤버다.
[public] static 리턴타입 메소드명(매개변수, ... ){ . . . }
- 인터페이스 구현
구현객체와 구현 클래스
인터페이스의 추상메소드에 대한 실체 메소드를 가진 객체를 구현 객체라고 한다. 그리고
이러한 구현객체를 생성하는 클래스가 구현 클래스다.
ㆍ구현 클래스 선언
자신의 객체가 인터페이스 타입으로 사용할수있다.
public class 구현클래스명implements 인터페이스명{} 으로 선언한다.
ㆍ추상 메소드의 실체 메소드를 작성하는 방법
메소드의 선언부가 정확히 일치해야하고, 인터페이스의 모든 추상 메소드를 재정의하는
실체 메소드를 작성해야한다. 만약에 일부만 재정의할 경우,
추상 클래스로 선언 + abstract 키워드를 붙인다.
ㆍ익명 구현 객체
명시적인 구현 클래스 작성 생략하고 바로 구현 객체를 얻는 방법인데 이름 없는
구현 클래스를 선언과 동시에 객체를 생성한다. 인터페이스의 추상 메소드들을 모두
재정의하는 실체 메소드가 있어야하고 추가적으로 필드와 메소드 선언 가능하나
익명 객체 안에서만 사용해야하며 인터페이스 변수로 접근이 불가하다.
ㆍ다중 인터페이스 구현 클래스
인터페이스는 상속과 달리 구현클래스에 다중으로 선언을 할수있다.
public class 구현클래스명implements 인터페이스A, 인터페이스B{} 로 선언 후
안에 각각 A,B 에 해당하는 추상메소드의 실체 메소드를 선언해 사용하면된다.
- 인터페이스 사용
디폴트 메소드 + 정적메소드가 둘다 들어가야한다.
- 타입변환과 다형성
인터페이스도 상속처럼 다형성을 구현할수있다. (Promotion+ Overriding)
- 인터페이스 상속
인터페이스 간에 상속이 가능한데,
public interface 하위 인터페이스 extends 상위 인터페이스1, 상위 인터페이스2{ . . . }
로 여러가지를 상속받을수있다. 그렇게 되면 하위 인터페이스 구현 클래스는 하위 인터페이스의 추상 메소드,
상위 인터페이스1의 추상 메소드, 상위 인터페이스2의 추상 메소드 모두 재정의를 해야한다. 또한
해당 타입의 인터페이스에 선언된 메소드만 호출 가능
- 디폴트 메소드와 인터페이스 확장
디폴트 메소드가 있는 인터페이스 상속
부모 인터페이스의 디폴트 메소드를 자식 인터페이스에서 활용하는 방법
-디폴트 메소드를 단순히 상속만 받음
-디폴트 메소드를 재정의(Override)해서 실행 내용을 변경
-디폴트 메소드를 추상 메소드로 재선언
-------------------------------8장 코딩 이미지-------------------------------------------------
9장 중첩 클래스와 중첩 인터페이스
- 중첩 클래스와 중첩 인터페이스란?
중첩클래스: 클래스의 멤버로 선언된 클래스
중접인터페이스 : 클래스 멤버로 선언된 인터페이스(UI 컴포넌트 내부 이벤트 처리에 많이 활용)
- 중첩 클래스
ㆍ인스턴스 멤버 클래스
class A{ // 인스턴스 멤버 클래스
class B{
B(){} //-------- 생성자
int field1; //-------- 인스턴스 필드
//static int field2; //-----------정적 필드x
void method1(){} // ----------인스턴스 메소드
//static void method2(){} //--------정적 메소드x
}
}
A a = new A();
A.B b = a.new B();
b.filed1 = 3;
b.method1();
ㆍ정적 멤버 클래스
class A{ // 정적인스턴스 멤버 클래스
static class C{
C(){} //-------- 생성자
int field1; //-------- 인스턴스 필드
static int field2; //-----------정적 필드
void method1(){} // ----------인스턴스 메소드
static void method2(){} //--------정적 메소드
}
}
A.C c = new A.C();
c.filed1 = 3; // 인스턴스 필드 사용
c.method1(); // 인스턴스 메소드 호출
A.C.filed2 = 3; // 정적 필드 사용
A.C.method2(); // 정적 메소드 호출
ㆍ로컬 클래스 – 메소드 내에서만 사용
void method(){ // 로컬클래스
class D{
D(){} //-------- 생성자
int field1; //-------- 인스턴스 필드
//static int field2; //-----------정적 필드x
void method1(){} // ----------인스턴스 메소드
//static void method2(){} //--------정적 메소드x
}
D d = new D();
d.field1 = 3;
d.method1();
}
void method(){
class DownloadThread extends Thread { . . . }
DownloadThread thread = new DownloadThread();
thread.start();
}
- 익명 객체
ㆍ 익명 객체: 이름이 없는 객체,익명 객체는 단독으로 생성 불가하다. 클래스 상속하거나
인터페이스 구현해야만 생성 가능
ㆍ 사용 위치
필드의 초기값, 로컬 변수의 초기값, 매개변수의 매개값으로 주로 대입
UI 이벤트 처리 객체나, 스레드 객체를 간편하게 생성할 목적으로 주로 활용
ㆍ익명 객체에 새롭게 정의된 필드와 메소드
오로지 익명 객체 내부에서만 사용한다. 외부에서는 익명 객체의 필드와 메소드에
접근할 수 없음
이유: 익명 객체는 부모 타입 변수에 대입되므로 부모 타입에 선언된 것만 사용이 가능하므로
10장 예외처리
- 예외와 예외 클래스
오류의 종류
-에러(Error): 하드웨어의 잘못된 동작 또는 고장으로 인한 오류
오류가 발생하면 프로그램은 종료, 정상실행 상태로 돌아갈수없다.
-예외(Exception) : 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인한 오류
예외가 발생되면 프로그램 종료, 예외 처리를 추가하면 정상 실행
상태로 돌아갈 수 있다.
예외의 종류
일반(컴파일 체크) 예외(Exception):예외 처리 코드 없으면 컴파일 오류 발생
실행 예외(RuntimeException):예외 처리 코드를 생략하더라도 컴파일이 되는 예외
경험 따라 예외 처리 코드 작성 필요
예외 클래스
java.lang.Exception -> 최상위
java.lang.ClassNotFoundException / java.lang.InterruptedException/ . . . /java.lang.RuntimeException
일반 (컴파일러 체크)예외 java.lang.NullPointerException
|
java.lang.NumberFormatException
실행 예
- 실행 예외
NullPointerException : 객체 참조가 없는 상태
(null 값 갖는 참조변수로 객체 접근 연산자인 도트(.) 사용했을 때 발생)
ArrayIndexOutOfBoundsException : 배열에서 인덱스 범위 초과하여 사용할 경우 발생
ClassCastException : 타입 변환이 되지 않을 경우 발생
- 예외 처리 코드
예외 발생시 프로그램 종료를 막고, 정상 실행을 유지할 수 있도록 처리한다.
일반 예외: 반드시 작성해야 컴파일 가능
실행 예외: 컴파일러가 체크해주지 않으며 개발자 경험 의해 작성
try – catch – finally 블록 이용해 예외 처리 코드 작성
여러번 다양한 예외를 처리하기 위한 다중catch도 가능.
- 예외 종류에 따른 처리 코드
catch 순서 : 상위 클래스가 위에 위치해야함
multi catch : 자바 7부터는 하나의 catch 블록에서 여러 개의 예외 처리 또한 가능하다
동일하게 처리하고 싶은 예외를 |로 연결
- 자동 리소스 닫기
try-with-resources : 예외 발생 여부와 상관 없음
사용했던 리소스 객체의 close() 메소드 호출해 리소스 닫음
리소스 객체 : 각종 입출력스트림, 서버소켓, 소켓, 각종 채널
java.lang.AutoCloseable 인터페이스 구현하고 있어야 함
- 예외 처리 떠넘기기
throws :메소드 선언부 끝에 작성하고 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠 넘기는 역할을함
- 사용자 정의 예외와 예외 발생
사용자 정의 예외 클래스 선언
자바 표준 API에서 제공하지 않는 예외
애플리케이션 서비스와 관련된 예외
사용자 정의 예외 클래스 선언 방법
public class XXXException extends [ Exception | RuntimeException ]{
public XXXException(){}
public XXXException(String message){super(message);}
}
-예외 정보 얻기
getMessage() : 예외 발생시킬 때 생성자 매개값으로 사용한 메시지를 리턴한다
원인을 세분화하기 위해 예외 코드를 포함(예: 데이터베이스 예외 코드)
catch() 절에서 활용한다
printStackTrace(): 예외 발생 코드 추적한 내용을 모두 콘솔에 출력한다
프로그램 테스트하면서 오류 찾을 때 유용하게 활용할수있다.
-------------------------------10장 코딩 이미지-------------------------------------------------
11장
- 자바 API 도큐먼트
자바 API: 자바에서 기본적으로 제공하는 라이브러리(library),
프로그램 개발에 자주 사용되는 클래스 및 인터페이스 모음
API 도큐먼트: 쉽게 API 찾아 이용할 수 있도록 문서화한 것
HTML 페이지로 작성되어 있어 웹 브라우저로 바로 볼 수 있음
- java.lang과 java.util 패키지
java.lang 패키지: 자바 프로그램의 기본적인 클래스를 담은 패키지
포함된 클래스와 인터페이스는 import 없이 사용
- Object 클래스
자바의 최상위 부모클래스
다른클래스를 상속하지 않았다면 java.lang.Object 클래스를 상속받았다는것을 암시하며
Object의 메소드는 모든 클래스에서 사용 가능하다
ㆍ객체 비교(equals() 메소드)
기본적으로 == 연산자와 동일한 결과 리턴 (번지 비교)
논리적 동등 위해 오버라이딩 필요
ㆍ객체 해시코드(hashCode())
객체 식별할 하나의 정수값
객체의 메모리 번지 이용해 해시코드 만들어 리턴(개별 객체는 해시코드가 모두 다름)
논리적 동등 비교 시 hashCode() 오버라이딩의 필요성
ㆍ객체 문자정보(toString())
객체를 문자열로 표현한 값, Object 클래스의toString() 메소드는 객체의 문자 정보 리턴
일반적으로 의미 있는 문자정보가 나오도록 재정의
-Date 클래스: 현재 시스템의 날짜와 시간 정보 리턴
-String 클래스: 저장하고 있는 문자열 리턴
ㆍ객체 복제(clone())
원본 객체의 필드 값과 동일한 값을 가지는 새로운 객체 생성하는 것
복제 종류
얕은 복제(thin clone): 필드 값만 복제 (참조 타입 필드는 번지 공유)
깊은 복제(deep clone): 참조하고 있는 객체도 복제
ㆍ객체 소멸자(finalize())
GC는 객체를 소멸하기 직전 객체 소멸자(finalize()) 실행
Object의 finalize() 는 기본적으로 실행 내용이 없음
객체가 소멸되기 전에 실행할 코드가 있다면? -Object의 finalize() 재정의
될 수 있으면 소멸자는 사용하지 말 것
-GC는 메모리의 모든 쓰레기 객체를 소멸하지 않고 구동시점이 일정하지 않음
- Objects 클래스
ㆍ객체 비교 (Objects.compare(T a, T b, Comparator<T> c))
a, b 두 객체를 비교자(c)로 비교해 int값 리턴
Comparator<T> 인터페이스
ㆍ동등 비교(equals()와 deepEquals())
두 객체의 동등 비교 :Objects.equals(Object a, Object b)
deepEquals(Object a, Object b)-비교할 객체가 배열일 경우 항목 값까지도 비교
ㆍ해시코드 생성(hash(), hashCode())
Objects.hash(Object… values)
매개값으로 주어진 값들 이용해 해시 코드 생성하는 역할
Arrays.hashCode(Object[]) 호출해 해시코드 얻어 리턴
클래스의 hashCode()의 리턴값 생성할 때 유용하게 사용
Objects.hashCode(Object o)
o.hashCode() 호출하고 받은 값 리턴 -매개값이 null 이면 0 리턴
ㆍ널 여부 조사(isNull(), nonNull(), requireNonNull())
Objects.isNull(Object obj) - obj가 null일 경우 true
Objects.nonNull(Object obj) - obj가 not null일 경우 true
requireNonNull()
ㆍ객체 문자정보(toString())
객체의 문자정보 리턴
첫 번째 매개값이 not null - toString ( )으로 얻은 값을 리턴
첫 번째 매개값이 not null - toString ( )으로 얻은 값을 리턴
- System 클래스
System 클래스 용도 -운영체제의 기능 일부 이용 가능
프로그램 종료, 키보드로부터 입력, 모니터 출력, 메모리 정리, 현재 시간 읽기
시스템 프로퍼티 읽기, 환경 변수 읽기
프로그램 종료(exit()) - 강제적으로 JVM 종료
int 매개값을 지정하도록 - 종료 상태 값
– 정상 종료일 경우 0, 비정상 종료일 경우 0 이외 다른 값
– 어떤 값 주더라도 종료
만약 특정 상태 값이 입력되었을 경우에만 종료하고 싶다면?
– 자바의 보안 관리자 설정
ㆍ쓰레기 수집기 실행 요청(gc()) - 바뀌기 전의 정보를 빠르게 지워지도록 요청하는 클래스
ㆍ현재 시각 읽기 -현재 시간을 읽어 밀리 세컨드(currentTimeMillis() -> 1/1000초)
와 나노세컨드(nanoTime()->1/109초) 단위의 long값 리턴
주로 프로그램 실행 소요 시간 구할 때 이용
ㆍ시스템 프로퍼티 읽기(getProperty())
시스템 프로퍼티-JVM이 시작할 때 자동 설정되는 시스템의 속성값
시스템 프로퍼티 읽어오는 법 : String value = System.getProperty(String key);
ㆍ환경 변수 읽기(getenv())
운영체제가 제공하는 환경 변수 값 (문자열) 을 읽음 [String value = System.getenv (String name);]
- Class 클래스
(class와의 다른점은 class는 예약어라는것)
Class 클래스 -클래스와 인터페이스의 메타 데이터 관리(메타데이터: 클래스의 이름, 생성자 정보, 필드 정보, 메소드 정보)
ㆍClass 객체 얻기(getClass(), forName())
객체로부터 얻는 방법 - Class clazz(객체의 틀을 읽기위해) = obj.getClass(); (객체)
문자열로부터 얻는 방법
ㆍ리플렉션(반사된 정보)
클래스의 생성자, 필드, 메소드 정보를 알아내는 것
ㆍ동적 객체 생성(newInstance())
실행 도중 클래스 이름이 결정될 경우 동적 객체 생성 가능
(Dynamic: 동적 - 프로그램에 따라 정보가 바뀌는것)
- String 클래스
ㆍ생성자 - byte[] 배열을 문자열로 변환하는 생성자(키보드로부터 읽은 바이트 배열을 문자열로 변환)
ㆍString 메소드
문자열의 추출, 비교, 찾기, 분리, 변환등과 같은 다양한 메소드 가짐
ㆍ문자 추출(charAt()) -매개 값으로 주어진 인덱스의 문자 리턴
ㆍ문자열 비교(equals()) - 문자열 비교할 때 == 연산자 사용하면 원하지 않는 결과 발생!
ㆍ바이트 배열로 변환(getBytes()) -시스템의 기본 문자셋으로 인코딩된 바이트 배열 얻기
ㆍ문자열 찾기(indexOf())
매개값으로 주어진 문자열이 시작되는 인덱스 리턴
주어진 문자열이 포함되어 있지 않으면 -1 리턴
(특정 문자열이 포함되어 있는지 여부 따라 실행 코드 달리할 때 사용)
ㆍ문자열 길이(length()) – 공백도 문자에 포함
ㆍ문자열 대치(replace())
첫 번째 매개값인 문자열 찾음 > 두 번째 매개값인 문자열로 대치 > 새로운 문자열 리턴
ㆍ문자열 잘라내기(substring())
substring(int beginIndex, int endIndex) – 주어진 시작과 끝 인덱스 사이의 문자열 추출
substring(int beginIndex) – 주어진 인덱스 이후부터 끝까지 문자열 추출
ㆍ알파벳 소∙대문자 변경 (toLowerCase(), toUpperCase())
ㆍ문자열 앞뒤 공백 잘라내기(trim())
ㆍ문자열 변환(valueOf()) - 기본 타입의 값을 문자열로 변환
- StringTokenizer 클래스
문자를 토큰화 하여 쪼개는것
ㆍ문자열 분리 방법
String의 split() 메소드 이용
java.util.StringTokenizer 클래스 이용
ㆍString의 split() -정규표현식을 구분자로 해서 부분 문자열 분리 > 배열에 저장하고 리턴
ㆍStringTokenizer 클래스
int- countTokens() : 꺼내지 않고 남아있는 토큰의 수
boolean - hasMoreTokens() : 남아있는 토큰이 있는지 여부
String - nextToken() : 토큰을 하나씩 꺼내옴
ㆍ문자열 결합 연산자 +
String 은 내부의 문자열 수정 불가 -> 대치된 새로운 문자열 리턴
- StringBuffer, StringBuilder 클래스
StringBuffer, StringBuilder
버퍼(buffer:데이터를 임시로 저장하는 메모리)에 문자열 저장
버퍼 내부에서 추가, 수정, 삭제 작업 가능
버퍼 내부에서 추가, 수정, 삭제 작업 가능
단일 스레드환경: StringBuilder 사용
- 정규 표현식과 Pattern 클래스
ㆍ정규 표현식(Regular Expression) 작성 방법
문자열이 정해져 있는 형식으로 구성되어 있는지 검증할 때 사용(Ex) 이메일, 전화번호, 비밀번호 등)
문자 또는 숫자 기호와 반복 기호가 결합된 문자열
ㆍPattern 클래스 -정규 표현식으로 문자열을 검증하는 역할(결과는 boolean 타입 )
- Arrays 클래스
배열 조작 기능을 가지고 있는 클래스 - 배열 복사, 항목 정렬, 항목 검색
ㆍ배열 복사
Arrays.copyOf(원본배열, 복사할 길이)
– 0 ~ (복사할 길이-1)까지 항목 복사
– 복사할 길이는 원본 배열의 길이보다 커도 되며 타겟 배열의 길이
copyOfRange(원본 배열, 시작 인덱스, 끝 인덱스)
– 시작인덱스 ~ (끝 인덱스-1)까지 항목 복사
System.arraycopy()
-System.arraycopy(원본배열, 원본 시작인덱스, 타겟배열, 타겟시작인덱스, 복사갯수)
ㆍ배열 항목 비교
Arrays.equals(배열, 배열) - 1차 항목의 값만 비교
Arrays.deepEquals(배열, 배열) - 중첩된 배열의 항목까지 비교
ㆍ배열 항목 정렬
Arrays.sort(배열)- 항목 오름차 순으로 정렬
– 기본 타입이거나 String 배열 자동 정렬
사용자 정의 클래스 배열은 Comparable 인터페이스를 구현해야만 정렬
ㆍ배열 항목 검색
특정 값 위치한 인덱스 얻는 것
Arrays.sort(배열)로 먼저 정렬
Arrays.binarySearch(배열, 찾는 값) 메소드로 항목을 찾아야
- 포장(Wrapper) 클래스
ㆍ포장(Wrapper) 객체
기본 타입(byte, char, short, int, long, float, double, boolean) 값을 내부에 두고 포장하는 객체
기본 타입의 값은 외부에서 변경 불가
ㆍ박싱(Boxing)과 언박싱(Unboxing)
박싱(Boxing): 기본 타입의 값을 포장 객체로 만드는 과정
언박싱(Unboxing): 포장 객체에서 기본 타입의 값을 얻어내는 과정
ㆍ자동 박싱과 언박싱
자동 박싱 - 포장 클래스 타입에 기본값이 대입될 경우 발생
자동 언박싱 - 기본 타입에 포장 객체가 대입될 경우 발생
ㆍ문자열을 기본 타입 값으로 변환 - parse + 기본타입 명 정적 메소드
ㆍ포장값 비교
포장 객체는 내부 값을 비교하기 위해 ==와 != 연산자 사용 불가
값을 언박싱해 비교하거나, equals() 메소드로 내부 값 비교할 것
- Math, Random 클래스
ㆍMath 클래스 -수학 계산에 사용할 수 있는 정적 메소드 제공
(절댓값, 올림, 내림, 최대값, 최소값, 랜덤, 가까운 정수의 실수, 반올림)
ㆍRandom 클래스
boolean, int, long, float, double 난수 입수 가능
난수를 만드는 알고리즘에 사용되는 종자값(seed) 설정 가능(종자값이 같으면 같은 난수)
- Date, Calendar 클래스
ㆍDate 클래스
날짜를 표현하는 클래스이다. 날짜 정보를 객체간에 주고 받을 때 주로 사용함(Date now = new Date();)
ㆍCalendar 클래스
달력을 표현한 추상 클래스
OS에 설정된 시간대(TimeZone) 기준의 Calendar 객체 얻기(Calendar now = Calendar.getInstance();)
다른 시간대의 Calendar 객체 얻을수 있고 날짜 및 시간 정보를 얻을 수 있다
- Format 클래스
ㆍ형식(Format) 클래스
숫자와 날짜를 원하는 형식의 문자열로 변환
ㆍ종류
숫자 형식: DecimalFormat
날짜 형식: SimpleDateFormat
매개변수화 된 문자열 형식: MessageFormat
ㆍ숫자 형식 클래스(DecimalFormat)
적용할 패턴 선택해 생성자 매개값으로 지정 후 객체 생성
ㆍ날짜 형식 클래스(SimpleDateFormat
ㆍ매개변수화 된 문자열 형식 클래스(MessageFormat)
- java.time 패키지
자바8부터 추가된 패키지
날짜와 시간을 나타내는 여러 가지 API가 새롭게 추가됨
날짜와 시간을 조작하거나 비교하는 기능이 추가됨
-Date와 Calendar는 날짜와 시간을 조작하거나 비교하는 기능이 불충분
-------------------------------11장 코딩 이미지-------------------------------------------------
이상의 자료는 최대 첨부량을 넘겼으므로 첨부할수없었음을 양해바랍니다.
