값타입
- 데이터를 직접 포함
- 복사된, 직접 가지는 데이터를 저장
- 한 연산이 다른 데이터에 영향을 미치지 않음
- 스택 영역에 데이터 저장
1 2
int i; i = 5;
위와 같은 정수형은 스택 영역에 데이터를 저장
1 2 3
int i = 5; int j; j = i;
이렇게 값을 지정할 경우 j값에 i값을 복사해서 저장한다.
참조 타입
- 데이터(객체)가 있는 곳의 위치를 저장
- 두 참조 타입 변수는 같은 객체를 가리킬 수 있음
- 한 연산이 다른 데이터에 영향을 끼칠수 있음
- 힙 영역에 데이터 사용
1
String s1 = "abc";
위와 같은 문자열은 heap에 ‘abc’ 를 저장하고 s1이 참조한다.
1 2 3
String s1 = "abc"; String s2; s2 = s1;
이렇게 값을 지정할 경우 s2에 s1이 참조하는 값을 같이 참조하게 된다.
Java 데이터 타입
기본 데이터 타입
- Java 언어에서 사전 정의되어 있는 데이터 타입
- 기본 값이 존재하는 데이터 타입으로 null이 존재하지 않음 (기본 타입)
- 정수,실수,문자,논리 리터럴 등의 실제 데이터 값을 저장하며, Stack 메모리 영역에 위치
- 예약된 키워드를 통해 정의
변수 명명 규칙
- 하나 이상의 글자로 이루어져야 함
- 첫 번째 글자는 문자이거나, _(Underscore) 또는 ‘$’ 이어여 함
- 키워드는 사용할 수 없음
권장되는 변수 이름 짓기
- 모든 변수 이름을 대문자로 쓰는 것을 피한다.
- 변수 이름이_(Underscore)로 시작하는 것을 피한다.
- 약어 사용을 피한다
- 여러 단어로 이루어진 이름을 사용할 경우 Camel Casing을 사용한다.
- Camel Casing : 첫 단어를 제외한 단어의 앞 글자를 대문자로 하여 작성 ( 예시: accountName
- Pascal Casing : 단어 앞 글자를 대문자로 하여 작성 ( 예시: AccountName
Java 키워드
- 키워드는 예약된 식별자로, 지정된 용도 이외에는 사용할 수 없음 따라서 변수이름으로 사용하면 안된다. (컴파일 오류)
- absstract, super, boolean, if, finally, class, interface…
- 대소문자로 구분하는 행위는 권장하지 않음 ( 예시: int INT
지역 변수 선언과 값 할당
1
2
3
4
5
6
class Hello{
int i; //전역 변수
public void funtion(){
int j;//지역 변수
}
}
funtion은 i를 참조 할수있지만 class에서는 j를 참조할 수 없다.
합성 할당
- 할당 연산자와 산술 연산자를 붙여서 같이 사용
+=, -=, %=, «=, »=, &=, ^=, = - 예시:
count = count + 10;
=>count += 10;
우선 순위
1
2
3
int k = 1;
System.out.println("k++ : "+ k++);
System.out.println("++k : "+ ++k);
위와 같이 ++위치를 다르게 해서 출력할 경우
1
2
k++ : 1
++k : 3
처음에는 출력이후 계산하기 때문에 1 마지막은 더한후에 출력하기 때문에 3이 나온다.
암시적 타입 변환
1
2
byte b = 127;
short s = b;
- byte -> short -> int 순으로 암시적 타입 변환 가능
- 암시적 타입 변환의 경우 변환은 실패하지 않는다. 하지만 정밀도가 떨어질 수 있다.
명시적 타입 변환
1
2
short s = 127;
byte b = (byte) s;
타입 변환식 (위의 경우 (byte))을 사용하여 변수의 타입을 명시적으로 변환할 수 있다.
1
2
3
long l = Long.MAX_VALUE;
int i = (int) l;
System.out.println(l+" : "+i);
1
9223372036854775807 : -1
long타입에서 int로 변환 하면 쉬프트 연산이 이루어 지는데 모두 1이 였던 2진수 값이 0으로 바뀌고 맨끝 값만 1이 되기 때문에 -1이 나오게 된다.
문과 예외
1
2
3
4
5
6
7
8
9
{
int localVariable;
{
int localVariable; //error
}
}
{
int localVariable;
}
- 중괄호를 문 블록 기호로 사용
- 블록은 문과 블록을 포함할 수 있음
- 블록과 그 상위 블록은 같은 이름의 변수를 가질 수 없음
- 같은 수준의 블록은 같은 이름의 변수를 가질 수 있음
문의 종류
- Java는 흐름 제어를 위한 세가지 종류의 문을 제공
- 선택문(Selection Statement) : if , switch 문
- 반복문(Iteration Statement) : While, do, for, foreach 문
- 분기문(Jump Statement) : break, continue 문
선택문(Selection Statement)
- if 문
1
2
3
4
5
6
int i=1;
if(i == 1){
System.out.println("welcome")
}
else{}
if 문은 가장 많이 사용되는 의사 결정문입니다. 다음과 같이 선택적으로 else 절과 결합될 수 있습니다.
1
2
3
4
5
6
7
8
String a = new String("abc");
//String a = "abc";
if(a == "abc"){
System.out.println("true");
}
if(a.equals("abc")){
System.out.println("equals true");
}
new String 으로 선언할 경우 “==” 로 비교 하게되면 heap 값이 다르기 때문에 예외가 발생한다.
추가적으로 괄호 안에는 Boolean-statement가 들어가야 한다.
- Cascading if 문
1
2
3
4
5
int x = 11;
if(x%2==0) System.out.println("even");
else if(x%2==1) System.out.println("odd");
else System.out.println("0");
위와 같이 else if문을 사용하여 단일 if문에서 원하는 만큼의 분기를 가지는 계단식 if문을 처리할 수 있습니다.
- 중첩 if 문
1
2
3
4
if(percent > 0 && percent < 100){
if(percent > 50) System.out.println("pass");
}
else System.out.println("error");
위와 같이 &&(And), ||(Or)을 통해 중첩 if를 사용할 수 있다.
- Switch문
- 여러 경우에 대응해야 하는 경우를 위해 switch문을 사용
- break문을 사용하여 문의 진행을 제어
1 2 3 4 5 6 7 8
int number = 3 switch(number){ case 1: case 2: System.out.println("x"); break; case 3: System.out.println("o"); break; }
2개 이상의 case가 같은 값을 요구할때 break를 생략하여 하나로 묶어 처리할 수 있다.
반복문
- while 문
1 2 3 4 5
int i = 0; while(i < 10){ System.out.println(i); i++; }
- boolean 값을 기준으로 내부 문을 수행
- 반복이 시작될 대 boolean 식을 평가, boolean 값이 true일 때 내부 문 실행
- 조건에 따라 한 번도 실행되지 않을 수 있음
- do 문
1 2 3 4 5
int i = 0; do{ System.out.println(i); i++; } while(i < 10);
- boolean 값을 기준으로 내부 문을 수행
- 반복이 끝날 때 boolean 식을 평가,boolean 값이 true일 때 내부 문 실행
- 조건에 따라 한 번도 실행되지 않을 수 있음
- for 문
- 작성요령
for(시작점;종료점;조건문)
- 반복의 시작부분에 반복 종료를 위한 업데이트를 명시
1 2 3
for(int i=0;i<10;i++){ System.out.println(i); }
for 블록 변수의 범위는 블록내로 한정됨
1 2 3 4
for(int i=0;i<10;i++){ System.out.println(i); } System.out.println(i);//error
위와 같이 쓸경우 범위를 벗어나기 때문에 오류가 발생한다.
- 작성요령
for 반복은 여러 개의 값을 반복에 사용할 수 있음
1
for(int i=0, j=0;...;i++,j++)
- foreach 문
분기문
- Java에서는 goto문을 제공하지 않음
- Java Virtual Machine에는 있었지만 제거됨
- goto 키워드는 존재하지만 구현되지 않음
LAB 4-1: 연도 일자를 월/일로 계산 (오류 수정하기)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import java.util.Scanner;
public class Whatday {
static int dayNum;
static int monthNum=0;
static String monthName;
public static void main(String[] args) {
System.out.println("1~365 사이 숫자를 입력하세요");
Scanner scan = new Scanner(System.in);
int dayNum = scan.nextInt();
while(true){
if (dayNum > 31) { // January
monthNum++;
dayNum -= 31;
}else break;
if (dayNum > 28) { // Feburary
monthNum++;
dayNum -= 28;
}else break;
if (dayNum > 31) { // March
monthNum++;
dayNum -= 31;
}else break;
if (dayNum > 30) { // April
monthNum++;
dayNum -= 30;
}else break;
if (dayNum > 31) { // May
monthNum++;
dayNum -= 31;
}else break;
if (dayNum > 30) { // June
monthNum++;
dayNum -= 30;
}else break;
if (dayNum > 31) { // July
monthNum++;
dayNum -= 31;
}else break;
if (dayNum > 31) { // August
monthNum++;
dayNum -= 31;
}else break;
if (dayNum > 30) { // September
monthNum++;
dayNum -= 30;
}else break;
if (dayNum > 31) { // October
monthNum++;
dayNum -= 31;
}else break;
if (dayNum > 30) { //November
monthNum++;
dayNum -= 30;
}else break;
if (dayNum > 31) { //December
monthNum++;
dayNum -= 31;
}else break;
break;
}
switch(monthNum) {
case 0:
monthName = "January";
break;
case 1:
monthName = "Feburary";
break;
case 2:
monthName = "March";
break;
case 3:
monthName = "April";
break;
case 4:
monthName = "May";
break;
case 5:
monthName = "June";
break;
case 6:
monthName = "July";
break;
case 7:
monthName = "August";
break;
case 8:
monthName = "September";
break;
case 9:
monthName = "October";
break;
case 10:
monthName ="November";
break;
case 11:
monthName ="December";
break;
}
System.out.println((monthNum+1)+"월"+dayNum+"일 : "+monthName);
}
}
LAB 4-2: foreach , for , while 문 사용하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import java.util.Scanner;
public class Whatday {
static int[] daysInMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
static String[] monthNames = {"January", "Feburary", "March", "April", "May", "June", "July", "August", "Sepetember", "October", "November", "December"};
public static void main(String[] args) {
int monthNum=0;
System.out.println("1~365 사이 숫자를 입력하세요");
Scanner scan = new Scanner(System.in);
int dayNum = scan.nextInt();
//foreach문
for(int dayInMonth : daysInMonth){
if(dayNum > dayInMonth){
dayNum-=dayInMonth;
monthNum++;
}
else break;
}
//for문
for(int i=0;i<daysInMonth.length;i++){
if(dayNum > daysInMonth[i]){
dayNum-=daysInMonth[i];
monthNum++;
}
else break;
}
while문
int i = 0;
while(dayNum > daysInMonth[i]){
dayNum -= daysInMonth[i];
monthNum++;
i++;
}
String monthName = monthNames[monthNum];
System.out.println(monthName+"/"+dayNum);
}
}