본문 바로가기

Programming language/Java

Java - 5 [Scanner, 기본형 - 참조형, null, final]

Scanner

- 자바에서 콘솔입력을 할때 많이 쓰는 클래스이다.

 

콘솔입력을 받을 때 예시 코드를 보여주면

Scanner sc = new Scanner(System.in);
            String spell = sc.nextLine();

여기서 Scanner 객체의 메소드들이 중요하다.

 

이렇게 입력받고자하는 자료형에 따라 입력 메소드를 다르게 줘야한다..

후.. 킹받네? 파이썬은 안그런데.. 그냥 때려넣으면 다알아서 알아듣는 천재 언어인데.. 후

 

자료형의 종류

- 자료형은 변수에 저장되는 값에 따라 두종류로 나누어진다.

 

기본형 vs 참조형

 

기본형은 말그대로 해당 자료형의 변수에 값자체를 보관하고

참조형은 해당 자료형의 변수에 값이 보관되어 있는 영역의 주소를 가르킨다.

 

int i = 4; 

i 는 4라는 값을 가지고 있고

 

Person person = new Person();

person은 Person 객체가 있는 영역의 주소를 가지고 있다.

 

따라서 이차이는 

 

int a = i; 라고 할때 a에는 4라는 값이 들어가서 상관없지만 (깊은복사)

Person a = new Person();

a = person;

a와 person은 같은 객체의 주소를 가지고 있기때문에 a와 i모두

같은 객체를 가르키게 된다. 즉, (얕은 복사)가 된다.

 

마찬가지로 배열또한 객체로 분류되기때문에 이와같이 얕은복사가 이루어진다.

int[] a = new int[3];
int[] b = a;

a[0] = 1;
b[0] = 2;

System.out.println(a[0]);
System.out.println(b[0]);
2
2

 

null

- null은 java에서 비어있음을 뜻한다. 이러한 단어는 참조형 자료형에서 밖에 사용 할 수가 없다.

- null을 포함한 참조형 변수를 호출한다면

Person p1 = null;
p1.getName();


Exception in thread "main" java.lang.NullPointerException

이렇게 아래 와 같이 널포인터 익셉션이라는 에러 메세지를 볼수 있다.

Person[] people = new Person[5];
people[0] = new Person("김신의", 28);
people[2] = new Person("문종모", 26);
people[3] = new Person("서혜린", 21);

for (int i = 0; i < people.length; i++) {
    Person p = people[i];
    System.out.println(p.getName());
}

위 코드는 people[1], people[4] 가 null 을 포함하고 있기 때문에 출력호출을 하면 널포인트 에러메시지가 나온다.

이러한 것을 대처하는 방법은 먼저 null변수인지 아닌지 확인 하는것이다. 

 

Person[] people = new Person[5];
people[0] = new Person("김신의", 28);
people[2] = new Person("문종모", 26);
people[3] = new Person("서혜린", 21);

for (int i = 0; i < people.length; i++) {
    Person p = people[i];
    if (p != null) {
        System.out.println(p.getName());
    } else {
        System.out.println(i + "번 자리는 비었습니다.");
    }
}
String s = null;
if (s != null || !s.isEmpty()) {
    System.out.println("Answer A");
} else {
    System.out.println("Answer B");
}

위 코드를 보면 어떤 결과가 나올까?

먼저 s != null 은 false이다.

!s.isEmpty() 는 s.isEmpty()라는 메소드에서 s라는 null을 포함한 참조형 변수를 호출한 것이기 때문에

nullPointerException이 일어나게된다.

 

* 참고로 or , and 연산에서

String s = null;
if (s != null || !s.isEmpty()) {
    System.out.println("Answer A");
} else {
    System.out.println("Answer B");
}

or은 맨 앞의 연산이 true일 경우 뒷연산을 하지 않고 바로 true을 낸다.

and는 맨앞의 연산이 false일 경우 뒷연산을 하지 않고 바로 false를 낸다.

 

final

- 위 키워드를 쓰면 변수를 상수로 만들 수 있다.

final double pi = 3.141592;
pi = 2.54;

한번 이렇게 값을 final로 지정해두면 변경이 불가능하다.

위코드 같은 경우에는 final 변수이므로 변경이 불가능하다는 에러메세지가 뜨게됩니다.

 

변수를 안전하게 변경이 불가능하도록 보호하기 위해서 사용합니다.