Home NhnAcademy 선발교육과정 2일차( 값 타입, Statement과 예외)
Post
Cancel

NhnAcademy 선발교육과정 2일차( 값 타입, Statement과 예외)

값타입

  • 데이터를 직접 포함
  • 복사된, 직접 가지는 데이터를 저장
  • 한 연산이 다른 데이터에 영향을 미치지 않음
  • 스택 영역에 데이터 저장
    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 문
    • 반복되는 변수의 타입과 이름 선택
    • Collection 클래스의 각 요소에 대해 포함된 구문 실행

      1
      2
      3
      4
      
      String[] colors = {"red","blue","green"};
      for(String color:colors){
      System.out.println(color);
      }
      

      위와 같이 colors 배열에서 color라는 임의의 이름을 정해 순서대로 출력할 수 있다.

분기문

  • 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);
    }
}

This post is licensed under CC BY 4.0 by the author.