제 1장 ( 프로그래밍이란 무엇인가? )
- 클래스 : 자바의 가장 작은 단위
- 메소드 : 어떤 값을 주고 결과를 넘겨주는 것
- 클래스가 가지고 있어야 하는 두가지 : 상태와 형태
- return : 메소드에서 결과를 돌려주기 위해 사용하는 예약어
public boolean(리턴 타입) checkPassword(메소드 이름) String password(매개 변수) {
// 중간 내용
}
- int : 소수점이 아닌 정수형을 나타내는 타입
- String : 단어나 문장을 저장해 놓을 수 있는 문자열
- 변수 : 클래스의 특성을 결정짓는 "상태"에 해당한다.
- 세미콜론(;) : 모든 자바 코드의 한 줄이 끝날 때에는 ; 를 적어주어야한다.
- 예약어 : public, class, int, return (예약되어 있으니까 쓰지 못하는 단어) , 예약어는 클래스, 메소드, 변수의 이름으로 사용할 수 없다.
제 2장 ( Hello God of Java )
1. main 메소드 : java 명령으로 실행하는 자바 프로그램의 진입점(시작점)은 main() 메소드이기 때문에 반드시 있어야 한다.
| public static void main(String[] args) { } |
- 반드시 외워야 하는 구문-
- public : "접근 제어자" 라는 것.
- static : 사전적 의미는 "정적인" 이라는 뜻. 자바의 예약어 중 하나이고, 메소드를 static 으로 선언하면 객체를 생성하지 않아도 바로 호출할 수 있다.
- void : 메소드 이름 바로 앞에는 그 메소드가 어떤 값을 넘겨줄지를 정한다. 그 중에서 돌려줄 것이 없을 때 사용하는 것이 void 다.
- main : 메소드(method) 이름이다. 반드시 이 이름을 써야한다. 대/소문자 구분도 하니 반드시 이 이름을 사용해야만 한다.
- (String [] args) : 메소드 이름 옆에 소괄호 안에 있는 것들은 매개 변수라고 한다. main() 메소드에 전달되는 매개 변수는 반드시 이 문구를 써야한다. 여기서 String 옆에 대괄호를 열었다 닫은 것은 args라는 변수가 배열이라는 말이다.
2. System.out.println()과 System.out.print()
- System.out.println() : 클래스에 있는 static 한 out 이라는 필드를 의미한다. 화면창에 무언가를 출력할 때 사용
- 둘의 차이점 : 줄을 바꿔서 출력할 일이 있으면 println() 메소드를, 줄을 바꾸지 않고 연달아서 출력할려면 print() 메소드 사용
3. 주석 처리
(1) 한줄 주석
| // |
- 이 // 뒤에는 어떤 글자가 오더라도 컴파일할 때 무시된다. 가장 많이 쓰이는 경우는 디버그용으로 앞 절에서 사용한 System.out.println()과 같은 코드를 감추려고 할 때 많이 사용된다.
(2) 블록 주석
| /* */ |
- 여러 줄을 한꺼번에 주석 처리 할 때 사용된다.
(3) 문서용 주석
| /** */ |
- 자주 사용은 안하지만, 제대로 개발을 하려면 필요한 것이 문서용 주석
- 문서용 주석이 클래스 선언 바로 앞이나, 메소드 선언 바로 앞에 있으면 문서용 주석으로 인식되어 처리된다.
4. 메소드에 대한 설명
| (1)public static (2)void (3)main((4)String [] args) { (6)System.out.println("Calculator class started"); } |
1. 제어자 : main() 메소드에 있는 public static과 같은 메소드의 특성을 정하는 부분이다.
2. 리턴 타입 : 메소드가 끝났을 때 돌려주는 타입을 말한다.
3. 메소드 이름 : 소괄호 앞에 있는 메소드 이름을 말한다.
4. 매개 변수 목록 : 소괄호 안에 있는 매개 변수의 목록을 말한다.
5. 예외 목록 : 메소드의 소괄호가 끝나는 부분과 중괄호가 시작하는 부분 사이에 예외 목록이라는 것을 선언할 수 있다.
6. 메소드 내용 : 중괄호 안에 있는 내용들을 말한다.
★메소드를 선언할 때 반드시 꼭 있어야 하는 세 가지★
1. 리턴 타입 2. 메소드 이름 3. 메소드 내용
제 3장 ( 자바를 제대로 알려면 객체가 무엇인지 알아야 한다 )
1. 자바는 객체지향 언어라고 한다.
- 이 세상의 모든 사물들은 객체로 되어 있다.
- 모든 사물에는 "상태" 와 "행위"가 있다.
public class Car {
int speed;
int distance;
String color;
public Car() {
}
public void speedUp() {
// 내용 생략
}
public void breakDown() {
// 내용 생략
}
}
- Car 클래스 선언문 밑에 메소드 같이 생긴 것을 "생성자"라고 부른다.
2. 클래스와 객체는 구분해야 한다.
public class Calculator {
public static void main(String [] args) {
System.out.println("Calculator class is started");
Calculator calc = new Calculator();
int a = 10;
int b = 5;
System.out.println("add=" + calc.add(a, b));
System.out.println("subtract=" + calc.subtract(a, b));
System.out.println("multiply=" + calc.multiply(a, b));
System.out.println("divide=" + calc.divide(a, b));
}
public int add(int a, int b) {
return a+b;
}
public int subtract(int a, int b) {
return a-b;
}
public int multiply(int a, int b) {
return a*b;
}
public int divide(int a, int b) {
return a/b;
}
}
- "Car()"라고 하는 메소드 같이 생긴 "생성자"를 사용하고 있는 것을 볼 수 있다. 생성자는 객체를 생성하기 위한 거의 유일한 도구다.
- new 라는 것은 자바에서 미리 정해져 있는 예약어 중 하나다.
- 객체는 뭘까 ? : "Car"라는 클래스는 그냥 껍데기일 뿐이고, new라는 예약어를 통해서 생성자인 car()를 호출하면 dogCar나 cowCar라는 객체가 생성된다. 즉, 클래스는 대부분 그 자체만으로 일을 할 수 없고, 객체를 생성해야만 우리가 일을 시킬 수 있다.
- 메소드를 불러주려면 객체 이름에 점을 찍고, 메소드 이름과 소괄호를 적어주면 된다.
- 메소드를 부르기전에 반드시 객체를 생성해야 한다.
- new 라는 단어를 써서 객체를 생성한다는 것을 정의 하였고, 옆에 클래스 이름을 적어주고 소괄호를 열고 닫았다.
- Calculator는 클래스 이름이고, 그 옆에 calc는 객체의 이름이다.
- 기본 생성자는 만들지 않아도 자동으로 생성해 준다.
- 자바에서 객체를 생성하는 것은 매우 중요하다. 객체를 생성할 때에는 new라는 예약어를 사용하여 만든다는 것과 메소드 같이 생긴 클래스 이름과 동일한 생성자를 호출한다는 것도 잊지 말자.
제 4장 ( 정보를 어디에 넣고 싶은데 )
1. 자바에서 존재하는 네 가지 변수
- 변수 : 어떤 프로그래밍 언어를 사용하든 간에, 내용을 어디엔가 담아 둬야한다. 그, 담아두는 것을 변수라고 한다.
(1) 지역 변수 : 메소드 내에서 생성된 변수(메소드 안에서만 유효하다), 중괄호 내에서 선언된 변수, 지역 변수를 선언한 중괄호 내에서만 유효하다. 메소드 호출시 생성, 메소드 종료시 소멸한다.
(2) 매개 변수(파라미터) : 메소드에 넘겨주는 변수, 메소드가 호출될 때 생명이 시작되고, 메소드가 끝나면 소멸된다.
(3) 인스턴스 변수 : 메소드 밖에, 클래스 안에 선언된 변수. 앞에는 static 이라는 예약어가 없어야 한다.
객체가 생성될 때 생명이 시작되고, 그 객체를 참조하고 있는 다른 객체가 없으면 소멸된다.
(4) 클래스 변수 : 인스턴스 변수처럼 메소드 밖에, 클래스 안에 선언된 변수 중에서 타입 선언 앞에 static 이라는 예약어가 있는 변수.
클래스가 처음 호출될 때 생명이 시작되고, 자바 프로그램이 끝날 때 소멸된다.
- 변수의 규칙
(1) 길이의 제한은 없다.
(2) 첫 문자는 유니코드 문자, 알파벳, $, _ 만 올 수 있다. 그런데 보통 변수 이름은 일반적으로 이것으로 시작하지 않는다.
(3) 두 번째 문자부터는 유니코드 문자, 알파벳, 숫자, $, _ 중 아무것이나 사용할 수 있다.
(4) 보통은 메소드 이름처럼 지정해서 사용한다. 첫 문자는 소문자로 시작하는 단어이고, 두 번째 단어의 첫 문자만 대문자로 시작하면 된다.
(5) 상수의 경우에는 모두 대문자로 지정하며, 단어와 단어 사이에는 _ 로 구분을 한다. 여기서 상수라는 것은 절대 변하지 않는 값을 이야기 한다. 따라서, 계속 값이 변하는 일반적인 변수는 이 _ 를 붙이지 않기 바란다.
2. 자바의 두 가지 타입(자료형)
(1) 기본 자료형 : 추가로 만들 수 없다.
- 기본 자료형은 8개이고 숫자, boolean 타입 두 가지로 나뉜다. 그리고 숫자는 정수형과 소수형으로 나뉜다.
- 정수형 : byte, short, int, long, char
- 소수형 : float, double
- 기타 : boolean
(2) 참조 자료형 : 마음대로 만들 수 있다(Calculator, Car)
- 초기화할 때 예외적인 것 : String 만이 참조 자료형이지만 new 를 사용해서 객체를 생성하지 않아도 되는 유일한 타입이다.
- 두 자료형의 차이점 : new를 사용해서 초기화하는 것을 참조 자료형, 그렇지 않고 바로 초기화가 가능한 것을 기본 자료형이라고 한다.
3. 자료형의 범위
| 타입 | 최소 | 최대 |
| byte | -128(-2^7) | 127(2^7-1) |
| short | -32,768(-2^15) | 32,767(2^15-1) |
| int | -2,147,483,648(-2^31) | 2,147,483,647(2^31-1) |
| long | -9,223,372,036,854,775,808(-2^63) | 9,223,372,036,854,775,807(2^63-1) |
| char | 0 ('\u0000')(0) | 65,535 ('\uffff')(2^16-1) |
2진수로 표현한 값을 보면 지수 부분이 2^n-1(n=3,4,5,6)으로 되어 있는 것을 알 수 있다.
즉, 각 타입이 나타낼 수 있는 숫자의 범위가 2배씩 증가한다.
4. 8비트와 byte 타입
- 0과 1을 표현할 수 있는 공간인 bit가 8개 모인 것을 1 byte라고 한다.
가장 오른쪽에서부터 2^0, 2^1, .. 순서로 값을 표현한다.
| 2^7 | 2^6 | 2^5 | 2^4 | 2^3 | 2^2 | 2^1 | 2^0 |
| 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
이 경우엔 2^1 + 2^0 = 3을 의미한다.
맨 앞 1bit는 값의 부호를 나타내는 값으로 sign bit라 하고 0이면 양수, 1이면 음수를 나타낸다.
sign bit가 0이고 나머지 bit가 다 1이면 127을 의미하고
sign bit가 1이고 나머지 bit가 다 0이면 -128을 의미한다.
책에는 나와있지 않지만 컴퓨터가 사용하는 2진수를 10진수로 바꿀 때 sign bit가 1이면(음수이면)
모든 bit를 반대로 바꿔주고(1이면 0으로, 0이면 1로)
거기에 +1을 해준 값을 양수 2진수를 10진수로 바꿀 때처럼 해주고 앞에 -기호를 붙여주면 된다.
byte 자료형의 가장 큰 값 127(0111_1111)에 +1을 하면 가장 작은 값 -128(1000_0000)이 된다.
반대로 가장 작은 값 -128(1000_0000)에 -1을 하면 가장 큰 값 127(0111_1111)이 된다.
이처럼 값의 범위를 넘어서는 값일 경우 예상하지 못한 값이 나오기 때문에 잘 생각하고 자료형을 정해줘야 한다.
무조건 큰 자료형을 사용하게 되면 불필요한 저장공간을 많이 쓰게 되기 때문에 필요한 크기에 가장 적합한 자료형을 사용하는 것이 좋다.
5. 다른 정수형 타입들은 어떻게 활용하나?
사용할 데이터의 크기에 따라 가장 작은 byte, short, int, long 순으로 사용한다.
기본적으로 자바에서는 숫자를 명시하면 int로 생각하기 때문에 long의 경우는 선언할 때 값의 뒤에 L을 붙여줘야 한다.
6. 소수점을 처리하고 싶어요
소수점을 처리하는 float는 32비트, double은 64비트로 표현된다.
두 자료형은 제공할 수 있는 범위를 넘어서면 정확성을 보장하지 못하기 때문에 간단한 계산에서는 사용해도 되지만, 돈 계산과 같이 정확성을 요구하는 부분에서는 사용해서는 안된다.
소수점 처리시에는 일반적으로 double을 많이 사용한다.
7. float와 double의 범위
- float : 부호(1) + 지수(8) + 가수(23) = 32비트
- double : 부호(1) + 지수(11) + 가수(52) = 64비트
8. Oracle의 자바 설명서에 정의된 float와 double
- float : single-precision 32-bit IEEE 754 floating point
- double : double-precision 64-bit IEEE 754 floating point
float는 단일 정확도를 가지는 32비트 IEEE(아이 트리플이) 754 부동 소수점이라는 의미이다.
IEEE는 국제적인 표준을 의미하고, 숫자는 그 표준의 번호이다.
9. char와 boolean은 어떻게 쓰는 거지?
- char : 캐릭터(character)라고 읽고, 보통 문자열과 관련된 부분에서 사용
- 자바에서는 Unicode(유니코드)라는 2byte를 사용해 ASCII가 할당된 값이 먼저 나오고 그 다음에 유니코드들이 나옴
- ASCII는 1byte 단위의 문자들(알파벳, 숫자, 기호 등)마다 고정되어 있는 번호를 할당해놓은 것으로 어떤 컴퓨터든, 어떤 언어든, 어떤 OS든 똑같음
- char 값을 지정하는 3가지 방법
- 홑따옴표 안에 직접 문자를 넣는 것
- 홑따옴표 안에 \u과 16진수 값을 넣는 것
- 해당 값의 유니코드 번호를 지정
- boolean : "true"와 "false" 두가지 값만 가지는 타입
10. 기본 자료형의 기본 값은 뭘까?
인스턴스 변수, 클래스 변수, 매개 변수는 값을 지정하지 않아도 기본값으로 지정이 되지만,
지역 변수는 반드시 값을 지정해줘야 한다.
값을 지정하지 않는 건 좋지 않은 습관이니 명시적으로 값을 지정해주는 게 좋다.
클래스의 인스턴스 변수를 초기화하지 않을 경우 대부분은 0, char는 공백, boolean은 false가 기본값으로 할당된다.