본문 바로가기
자바과정/Java

Java 기초 - 2일차(추가 및 보완)

by Parkej 2021. 1. 30.

패키지 (package)

 

// package 

 - 패키지는 비슷한 성격의 자바 클래스들을 모아 넣는 자바의 디렉토리이다. (폴더 개념)

package java.home;

public class Homepej {
}


package java.home;

public class HomePark {
}

 

- 패키지를 만들때는 위와 같이 package라는 키워드를 사용한다.

위 두개의 클래스를 이클립스에서 작성하고 저장하면 이클립스의 파일이 저장되는 디렉토리에 다음과 같은 구조의 파일들이 생성되는 것을 확인할 수 있다.

src/java/home/Homepej.java
src/java/home/HomePark.java
bin/java/home/Homepej.class
bin/java/home/HomePark.class

* 서브 패키지도 있음.

 

 

임포트 (import)

 

 

// import java.lang.*; // default로 써져있는거임 우리가 가장 많이 쓰는것들을 묶어놓은거임.
import java.util.Scanner; // 임포트 

- 다른 클래스에서 Homepej 클래스를 사용하려면 다음과 같이 import 를 해야함.

import jump2java.house.HouseKim; 
import jump2java.house.*; // 패키내 모든 클래스 import

* 같은 패키지 내에서는 import 없이 사용이 가능하다

 

패키지의 장점

 - 클래스의 분류가 용이하다. (비슷한 것 끼리 묶는다)

 - 패키지가 다르다면 동일한 클래스명을 사용할 수 있다.

 

 

Reference(참조)

 

 - 전자화된 시스템의 가장 중요한 특징은 복제다. 현실의 사물과 다르게 전자화된 시스템 위의 데이터를 복제 하는데는 비용이 거의 들지 않는다.

 

예시)

public class Refer {
 
    public static void opValue(){
        int a = 1;
        int b = a;
        b = 2;
        System.out.println("opValue, "+a); 
    }
 
    public static void main(String[] args) {
        opValue();
    }
}

 

 

값을 변경한 것은 변수 b이기 때문에 변수 a에 담겨있는 값은 그대로이다.  변수 b의 값에 변수 a의 값이 복제 된 것이다. 

 

int a = 1;

A a = new A(1);

 

전자는 데이터형이 int이고 후자는 A이다. int는 기본 데이터형(원시 데이터형, Primitive Data Types)이다. 자바에서는 기본 데이터형을 제외한 모든 데이터 타입은 참조 데이터형(참조 자료형)이라고 부른다. 기본 데이터형은 위와 같이 복제 되지만 참조 데이터형은 참조된다. new를 사용해서 객체를 만드는 모든 데이터 타입이 참조 데이터형이라고 생각해도 된다. (단 String은 제외다) 이를 그림으로 나타내면 아래와 같다.

 

변수에 담겨있는 데이터가 기본형이면 그 안에는 실제 데이터가 들어있고, 기본형이 아니면 변수 안에는 데이터에 대한 참조 방법이 들어있다고 할 수 있다.

 

 

 

가비지 컬렉션(GC)

 

가비지 컬렉션이라는 개념은 자바에서 처음 사용된 것이 아니다. LISP 라는 언어에서 처음 도입된 개념이다. 하지만, 자바가 가비지 컬렉션이란 개념을 더욱 대중화 시킨데 기여한 부분은 있다.

프로그래머는 힙을 사용할 수 있는 만큼 자유롭게 사용하고, 더 이상 사용되지 않는 오브젝트들은 가비지 컬렉션을 담당하는 프로세스가 자동으로 메모리에서 제거하도록 하는 것이 가비지 컬렉션의 기본 개념이다.

자바는 가비지 컬렉션에 아주 단순한 규칙을 적용한다.

Heap 영역의 오브젝트 중 stack 에서 도달 불가능한 (Unreachable) 오브젝트들은 가비지 컬렉션의 대상이 된다.

GC라는 기능이 안쓰이는 heap 안의 객체들을 지워버림 (동적 메모리 자동삭제?)

 

 

NullPointException 원인, 예방, 해결하기

정의

 - null 때문에 발생하는 Runtime Exception

 

문제점 

 - null자체의 의미가 모호해 다양한 파생 에러 발생

 - 에러 발생 이후 디버깅이 매우 어렵다

 

해결 및 예방법

1. null Parameter를 넘기면 안됨

 - 뒷단에서 방어로직을 짜 놓는다 하더라도 "의미 없는 null"은 parameter로 넘기지 않도록 한다.

 - 의미없는 null로 인해 쓸데없는 null체크도 해줘야 하며, 파생 오류 처리가 발생하게 된다.

 

ex )

 

Scanner sc = null;

 

// 혹시 null이 넘어오게 되면 기본형(int)이므로 default 0선언

int size = param.getSize();

 

// (숫자 / 0)이므로 /0때문에 ArithmeticException 발생

totalPages = (int) (totalCnt / size);

2. null 여부 비교 처리 추가

 - 대부분 개발자들이 "NPE" 예방을 위해 사용하고 있는 방법

 

ex)

String a = null;
System.out.println(a.indexOf("갓"));

/******* 결과 *******/
Exception in thread "main" java.lang.NullPointerException 

String a = null; 
if(a != null){
System.out.println(a.indexOf("갓"));
}


3. 문자열 비교시 equlas 문자열을 먼저 위치 하자. (또는 Constants 사용하자)

 - String 문자열은 기본형이 아니다. 객체이기 때문에 문자열 비교를 위해 "equals" 메서드를 사용한다.

"비교의 주체가 문자열"부터 주어진다면 "NullPointException" 발생하지 않는다.

결국 순서만 바꿨음에도 적어도 "NullPointException" 피할 수 있게 된다.

 

정리해보면 문자열 비교는 "non-null String 기준으로 비교" 하는 것이 좋다.

"비교의 주체가 문자열"이 오도록 하거나, "Constants 등을 활용" 하여 코딩 하는 것을 추천 한다.





 

 

 

 

 

improt And package 출처

점프 투 자바

wikidocs.net/231

 

reference 출처 : 

opentutorials.org/module/2495/14152

 

 

GC 참조 사이트 :

yaboong.github.io/java/2018/06/09/java-garbage-collection/

 

NullPointException에 대하여

출처: https://goddaehee.tistory.com/126 [갓대희의 작은공간]

반응형

'자바과정 > Java' 카테고리의 다른 글

Java 실습(성적처리프로그램) - 3일차  (0) 2021.02.01
Java 기초 - 3일차  (0) 2021.02.01
Java 기초 - 2일차  (0) 2021.01.29
Java 실습(사칙연산 반복계산) - 2일차  (0) 2021.01.29
Java 실습(구구단) - 2일차  (0) 2021.01.29

댓글