Ch3. Fundamental programming structures in Java (1)
3.1 a simple java program
public : 다른 클래스에서 접근이 가능
class : 모든 것은 클래스 내에 포함되어 있어야 한다.
FirstSample : 클래스 이름, CamelCase
source code의 파일 이름은 class name으로 저장해야 한다. ex) FirstSample.java
main : JVM이 처음 실행되는 부분
static : Ch.4에서 다루겠음
System.out이라는 객체가 이것의 함수인 println을 호출.
- Java에서 method를 호출하는 snytax : object.method(parameters);
파라미터의 수는 0,1,2 ..
parenthese(괄호)는 파라미터가 없어도 필요함. ex) System.out.println();
Naming Convention
- CamelCase : 단어가 합쳐진 부분마다 맨 처음 글자를 대문자로 표기.
- lowerCamelCase : 맨 앞글자는 소문자
- UpperCamelCase(PascalCase) : 맨 앞글자도 대문자
- snake_case : 단어가 합쳐진 부분마다 _ 을 붙여주는 표기 방법.
Command line
- javac : 컴파일 명령어 (source -> byte code), byte code(.class) source code폴더와 같은 폴더 내에 자동으로 저장됨.
- java : 프로그램 실행 명령어 -> class 함수 중 main함수를 찾아서 JVM 실행
3.2 comments
comment라인은 실행되지 않는다.
1. single-line comments : //
2. multi-line comments : /* */
3. Documentation comments to generate documents automatically : /** @ */
3.3 Data Types
Java : strongly typed language
∴ 모든 변수들은 type이 선언되어야 한다.
8개의 primitive type이 존재한다. 자바는 unsigned type이 존재하지 않는다.
- 6 numeric types
- 4 integral types : int, short, long(L), byte
hex : 0x binary : 0b
- 2 floating-point types : float(F), double(default)
Double.POSITIVE_INFINTY, Double.NEGATIVE_INFINITY, Double.NaN(숫자가 아님)
- character type : char (for Unicode system) , UTF-16 코드 단위를 조작하지 않는 한 사용 비추
Unicode System : 세계의 사용되는 언어들을 표현할 수 있는 전 세계적으로 보편적인 인코딩
UTF-16 encoding에 code unit이 설명되어 있음.
code point : 코드 값 : encoding system에 의해 결정된다.
Unicode standard에서는 code point는 hexademical이면 U+ 로 표시된다.
UTF-16 : 모든 unicode charter는 1/2개의 code unit을 필요로 한다.
: variable length code로 모든 유니 코드 포인트를 나타낸다.
- boolean type : true/false
int type과 Boolean type간의 전환은 없다.
C/C++에서는 number, pointer도 불린 값으로 사용 될 수 있다. ex) 0 = false
String type : primitive type은 아니지만 library에 정의된 클래스이다.
3.4 Declaration of Variables
syntax : <data type> <variable name>
변수는 사용되기 전에 초기화 되어야 한다
final : 한 클래스 내의 한 method에서 local constant로로 사용하도록 하는 keyword.
static final : 한 클래스 내의 모든 method에서 전역으로 사용하도록 하는 keyword.
3.5 Operators
a) usual arithmetic operators : + - * / %
b) prefix and postfix operators : ++ --
c) relational operators : == != < <=
d) logical(boolean) operators : && || !
e) ternary operator : a : b ? c : d
f) bitwise operator : & | ^ ~
java.lang.Math : 다양한 math function 존재
System.out.println과 math 함수 호출의 차이점은 정적/ 동적 함수
- Automatic type conversion(widening)
점선 : 이전 값을 변환하면서 손실 발생
실선 : 손실 허용 X
- Casting : 강제 형변환
Math.round(x) : return long data tye
enum : 서로 관련 있는 상수들을 모아 심볼릭한 명칭의 집합으로 정의한 것(ch.5에서 자세히)
syntax: enum <NameofEnumaration> {nominal1, nominal2 ..};
3.6 Strings and substrings
Java에는 내장된 문자열 유형이 존재하지 않다.
하지만, 표준 library에 String이 정의 된 호출이 포함되어 있다.
-> java.lange.String
Java의 String은 Unicode characters의 연속이다.
ex) String literals "Java\u2122" -> J,a, v, a ,TM(trade mark) \u2122 = U+2122
각 각의 "" string은 String class의 instance이다.
String 클래스의 substing 함수를 이용해 더 큰 문자열에서 하위 문자열을 추출(extract) 할 수 있다.
ex) String greeting = "Hello";
String s = greeting.substring(0,3); == s = "Hel"
(a, b) : position = start~ length-1, last position is excluded.
length = b - a
+ : 두 string을 합치는데 사용 됨.
만약 하나의 operand가 string이 아니라면, string으로 변환된다.
ex) int age = 13;
String rating = "PG" + age; (rating = "PG13")
String 클래에는 기존 문자열에서 문자를 변경하는 방법이 없다.
→ String class의 객체는 immutable(변경 불가) : String 인스턴스는 생성할 때 메모리 힙 영역에 할당되어 변경 불가능
ex) String greeting = "Hello"; //greeting은 stack의 변수고, Hello는 heap의 객체이다.
greeting = greeting.substring(0,3) + p! //greeting = "Hel!p" , 새로운 인스턴스
-> Hello 인스턴스가 바뀐 것이 아니다.
String 객체의 immutablitiy로 인해 두 개의 메모리 공간(stack memory area, heap momory area)을 고려해야 한다.
또, stack memory의 reference variable과 heap memory의 한 클래스의 객체의 차이를 알아야 한다.
StringOne.equals(StringTwo) : 둘이 같으면 1 반환 (대소문자 구별)
StringOne.equalsIgnoreCase(StringTwo) : 대소문자 구별 X
ex) String greeting = "Hello";
"Hello".equals(greeting);
"hello".equalsIgnoreCase(greeting);
※ 문자열 비교를 == 이 아니다.
※ Empthy string(길이가 0) != Null String
empthy string : heap area에 있는 java object다.
null은 스택 영역의 문자열 참조 변수에 해당하는 heap의 객체가 없는 특별한 값이다.
ex) String str =" ";
str.equals(" ");
str.length == 0;
ex) String str = NULL;
str == null; (null의 경우 생성되지 않은 인스턴스이기 때문에 메소드를 사용하는 .equals는 사용 불가능)