프로그래밍 공부/JAVA

JAVA 입문 강의정리 (클래스~패키지)

Wonuk 2021. 7. 20. 21:08
반응형

본 포스팅은 프로그래머스 자바 입문 강의에 기반하여 작성되었습니다.

자바 강의의 모든 내용이 적힌것이 아닌 복습시 놓쳤던 부분을 하나하나 정리한 내용입니다.

     순서 클래스, String클래스, 필드, 메소드, string클래스의 메소드, 변수의 scope와 static, 열거형, 생성자, this

     메소드 오버로딩, 생성자 오버로딩과 this, 패키지

  • 객체지향언어

     자바는 최초의 객체지향 언어이다.
     프로그램을 구성하는 요소는 객체이며 이것이 상호작용 하도록 프로그래밍 한다.
     자바는 객체를 만들기 위해서 클래스를 먼저 만들어야 한다.
     클래스는 객체를 만들기 위한 틀 ex)붕어빵 - 객체, 틀 - class

클래스를 선언하는 방법
public class 클래스명 {}

Car클래스 생성하기
public class Car{}

Car객체 생성하기 -> Car와 다른 class에서 만듬

public class CarExam{
        public static void main(String args[]){
            Car c1 = new Car();
            Car c2 = new Car();
        }
    }

new 연산자

new연산자 뒤에 나오는 생성자를 이용하여 메모리에 객체를 만들라는 명령.
메모리에 만들어진 객체를 인스턴스(instance)라고도 한다.
이렇게 만들어진 객체를 참조하는 변수가 c1 , c2 이다.
위의 코드가 실행되면 Car라는 객체가 2개가 만들어지고 각각의 객체를 참조하는 c1과 c2변수가 선언됩니다.

  • 참조타입

     참조형 타입은 기본형 타입을 제외한 모든 타입입니다.
     앞서 배웠던, 배열도 참조형이고, 클래스도 모두 참조 타입입니다.

  • 참조형 변수

     String str = new String("hello");
     str 변수 앞에 기본형 타입이 아닌 String클래스가 적혀있다.
     이퀄(=)뒤에는 new 다음에 생성자라는 것이 있다.
     new 라는 키워드는 객체를 메모리에 올려준다. 이렇게 메모리에 올라간 객체를 인스턴스라고 말한다.
     메모리에 올라간 인스턴스를 가리키는 변수, 참조하는 변수, 레퍼런스 하는 변수가 str 이다.
     참조한다. 레퍼런스 한다라는 것은 변수가 인스턴스를 가지고 있는게 아니라 말그대로 가리킨다는 의미이다.
     str이라는 변수에는 메모리의 위치 값이 저장되는 것이다.
     메모리의 위치값이 저장된다고 하더라도, 어떤 메모리에 저장되는지 그 정보를 알 수 있는 방법은 없다.
     그렇기 때문에 str변수는 String 인스턴스를 참조한다라고만 아시면 된다.

앞으로 배울 클래스들은 모두 참조형이다

  • String클래스

      문자열을 표현하는 자바에서 가장 많이 사용하는 클래스

      자바 인스턴스 생성 방법
      String을 제외한 클래스는 모두 new를 사용하여 인스턴스를 생성하지만. String은 예외.

      1.new연산자를 이용하지 않고 인스턴스를 만드는 경우
         String str1 = "hello";
         String str2 = "hello";
         "hello"라는 문자열이 메모리 중에서 상수가 저장되는 영역에 저장된다. 상수는 변하지 않는 값을 의미.
         String str2 = "hello"; 이 문장이 실행될 때에 hello 라는 문자열 상수는 이미 만들어져 있으므로

         str1이 참조하는 인스턴스를 str2도 참조한다.

     

      2.new연산자를 이용해서 인스턴스를 만드는 경우

         String str3 = new String("hello");
         String str4 = new String("hello");
         new연산자를 이용하여 인스턴스를 만들면 인스턴스는 무조건 새롭게 만들어진다.
         String str4 = new String("hello"); 이 문장이 실행될때도 새롭게 만들게 되므로,

         str3 과 str4는 서로 다른 인스턴스를 참조한다.

 if(str1 == str2){  // 같은 인스턴스를 참조하므로 결과는 true 
        System.out.println("str1과 str2는 같은 레퍼런스입니다.");
    }

    if(str1 == str3){  // str1과 str3은 서로 다른 인스턴스를 참조하므로 결과는 false 
        System.out.println("str1과 str3는 같은 레퍼런스입니다.");
    }

    if(str3 == str4){  // str3과 str4는 서로 다른 인스턴스를 참조하므로 결과는 false 
        System.out.println("str3과 str4는 같은 레퍼런스입니다.");
    }
레퍼런스 참조 : https://imasoftwareengineer.tistory.com/83


참조변수끼리 == 로 비교하면 서로 같은 것을 참조하는지 비교한다.
String은 다른 클래스와 다르게 new를 사용하지 않고 사용할 수 있다. 메모리를 아끼려면 String은 new를 사용하지 않고 사용하는 것이 좋다.
String은 불변 클래스이다. 불변이란 String이 인스턴스가 될때 가지고 있던 값을 나중에 수정할 수 없다.
String은 문자열과 관련된 다양한 메소드를 가지고 있다. 메소드를 호출한다 하더라도 String은 내부의 값이 변하지 않는다.
String이 가지고 있는 메소드중 String을 반환하는 메소드는 모두 새로운 String을 생성해서 반환한다.
  String str5 = "hello world";
  String str6 = str5.substring(3);
substring은 문자열을 자른 결과를 반환하는 메소드이다. 해당 코드가 실행되어도 str5는 변하지 않는다.
str6은 str5가 가지고 있는 문자열 중 3번째 위치부터 자른 결과 즉 새로운 String을 참조하게 된다.

  • 필드(field)

      자동차는 자동차 이름, 자동차 번호를 가지고 있고, 자동차는 달리고 멈추는 기능이 있다. 
      여기에서 가지고 있는 것을 속성이라고 한다. 자바에서는 이러한 속성을 필드(Field)라는 용어로 사용한다.
      ex) 학생에게는 이름,학번의 필드가있다.

필드(field)선언
이름과 번호를 필드로 가지고 있는 Car클래스 선언
   

public class Car{
        String name;    
        int number;
    }

Car 클래스를 인스턴스화 하기
   

    Car c1 = new Car();
    Car c2 = new Car();
    //Car라는 인스턴스가 메모리에 2개 만들어 진다. 객체별로 name과 number라는 속성을 가진다.

속성 이용하기
    참조 변수 다음에 나오는 점(dot)은 참조변수가 참조하는 객체가 가지고 있는 것을 사용할 때 사용
 

    //c1.name은  c1이 참조하는 객체의 name 을 의미.

    c1.name = "소방차";  // c1이 참조하는 객체의 name을 소방차로 설정 
    c1.number = 1234;   // c1.number = 1234란 c1이 참조하는 객체의 number를 1234 로 설정 

    c2.name = "구급차"  // c2가 가리키는 객체의name을 구급차로 설정
    c2.number = 1004;  // c2가 가리키는 객체의 number를 1004로 설정


    System.out.println(c1.name);  //콘솔에 c1이 참조하는 객체의 name 을 출력합니다. 소방차
    System.out.println(c1.number); //콘솔에 c1이 참조하는 객체의 number 를 출력합니다. 1234
  • 메소드

      필드가 물체의 상태라면, 물체의 행동(기능)에 해당하는게 메소드다.
      car에 이름과 번호가 있기도 하지만, car는 앞으로 전진할수도 있고 후진하는 행동도 할 수 있다.

      메소드는 입력값이 있고, 그 입력값을 받아서 무언가 한 다음 결과를 도출해 내는 수학의 함수와 비슷한 개념이다.
      이때 입력값을 매개변수 혹은 인자라고 하고, 결과값을 리턴값이라고 합니다.
      인자( Argument ) 는 어떤 함수를 호출시에 전달되는 값을 의미한다.
      매개 변수( Parameter ) 는 그 전달된 인자를 받아들이는 변수를 의미한다.
      메소드란 클래스가 가지고 있는 기능이다. 클래스 안에 선언됩니다.

메소드의 선언
public 리턴타입 메소드명 (매개변수 들) { 구현할 기능 }
리턴타입이 있거나 없거나 매개변수가 있거나 없거나 할수있다.

1. 매개변수도 없고 리턴하는 것도 없는 형태의 메소드
리턴하는 것이 없을 경우 void라고 작성합니다.

  

public class MyClass{
        public void method1(){
            System.out.println("method1이 실행됩니다.");
        }
    }


2. 정수를 받아들인 후, 리턴하지 않는 메소드
받아들이는 값은 어떤 타입이라도 상관없다.
받아 들이는 값의 수는 여러개 일 수 있다. 여러개일 경우 콤마(,)로 구분한다.

 public class MyClass{       
        public void method2(int x){
            System.out.println(x + " 를 이용하는 method2입니다.");
        }
    }

3. 아무것도 받아들이지 않고, 정수를 반환하는 메소드
리턴하는 값 앞에 return 이라는 키워드를 사용한다.
메소드 이름 앞에는 리턴하는 타입을 적어준다.
리턴타입은 하나만 사용할 수 있다. 리턴하는 타입은 어떤 타입이라도 상관없다.

  public int method3(){
        System.out.println("method3이 실행됩니다.");

        return 10; // 정수를 꼭 리턴(반환)해야한다.
    }

위 메소드가 실행되면, 콘솔에 'method3이 실행됩니다.' 를 출력하고, 이 메소드를 호출한 쪽에 10을 리턴한다.

4. 정수를 2개 매개변수로 받고, 아무것도 반환하지 않는 메소드
   

public void method4(int x, int y){
        System.out.println(x + "," + y + " 를 이용하는 method4입니다.");
    }

정수말고 참조형 데이터 타입도 충분히 사용 가능하다.

5. 정수를 한개 받아들인 후, 정수를 반환하는 메소드

 public int method5(int y){
        System.out.println(y + " 를 이용하는 method5입니다.");
        return y*2;
    }


메소드의 사용
메소드를 사용하기 위해서는 메소드가 정의된 클래스가 생성되어야 한다
객체를 생성할 때는 new 연산자를 이용한다.
메소드 사용할때는 생성된 클래스를 참조하는 레퍼런스변수.메소드명() 으로 사용할 수 있다

    public class MyClassExam{
        public static void main(String args[]){
            MyClass my1 = new MyClass(); //메소드가 정의된 클래스 생성 

            my1.method1();   //MyClass에서 정의해 놓은 메소드 method1() 를 호출한다.       
            my1.method2(10);

            int x = my1.method3();
            System.out.println("method3 이 리턴한 " + x + " 입니다.");

            my1.method4(10,100);
            int x2 = my1.method5(50);
            System.out.println("method5 가 리턴한 " + x2 + " 입니다.");
        }
    }

 

  • String클래스의 메소드 이용하기

 

      문자열 길이 구하기
       str.length()는 str이 참조하는 문자열의 길이를 구해서 int 타입으로 리턴해주는 메소드 이다.
       System.out.println(str.length());  // 결과값 = str

      문자열 붙히기 (concat)
      str.concat("world") 메소드는 str 이 참조하는 문자열 hello 에다가 메소드의 인자로 들어온

      문자열 world 를 붙혀서 String 타입으로 리턴하는 메소드다.
      String Class는 불변 클래스, 메소드가 수행되면, 새로운 문자열을 만든다. 그러므로, 원래 클래스는 변하지 않는다.
      원래 클래스가 변하면 그것을 참조하던 다른 변수들에게 문제가 생기기 때문에 불변한다.
       String str = new String("hello");

       System.out.println(str.concat(" world"));  //출력결과는 hello world 
       System.out.println(str);  //출력결과는 hello 

       문자열 자르기 (subString)
       str.subString(1,3) 은 str이 참조하는 문자열을 인덱스 1번부터 3번까지 자른 결과이다.
       str.subString(2) 은 str이 참조하는 문자열을 2번 인덱스부터 마지막까지 자른 결과를 의미한다.
       문자열의 인덱스는 0번 부터 시작한다.
       System.out.println(str.substring(1, 3)); //출력결과  el
       System.out.println(str.substring(2));   //출력결과 llo world

  • 변수의 scope와 static

      변수의 스코프
      프로그램상에서 사용되는 변수들은 사용 가능한 범위를 가진다.
      그 범위를 변수의 스코프라고 한다.

      변수가 선언된 블럭이 그 변수의 사용범위이다.

    public class ValableScopeExam{

        int globalScope = 10;   // 인스턴스 변수 

        public void scopeTest(int value){   
            int localScope = 10;
            System.out.println(globalScope); // 사용가능
            System.out.println(localScope); // 사용가능
            System.out.println(value); // 사용가능
        }
         public void scopeTest2(int value){   
            int localScope = 10;
            System.out.println(globalScope); // 사용가능
            System.out.println(localScope); // 오류 = localScope는 scopeTest의 변수
            System.out.println(value); // 오류 = value는 scopeTest의 매개변수
            System.out.println(value2); // 사용가능
        }
    }


클래스의 속성으로 선언된 변수 globalScope 의 사용 범위는 클래스 전체 이다.
매개변수로 선언된 int value 는 블럭 바깥에 존재하기는 하지만, 메서드 선언부에 존재하므로 사용범위는 해당 메소드 블럭내이다.
메소드 블럭내에서 선언된 localScope 변수의 사용범위는 메소드 블럭내이다.

main메소드에서 사용하기
모든 클래스는 인스턴스화 하지 않은 채로 사용 할 수 없다.
키워드 static을 사용하면 인스턴스화(new) 하지않아도 사용 가능하다.
같은 클래스 안에 있는데 globalScope 변수를 사용 할 수 없다.
main은 static한 메소드이다. 
static한 메서드에서는 static 하지 않은 필드를 사용 할 수 없다.
-> static한 메소드가 사용하는 시점에 해당 클래스가 인스턴스화 되지 않았을수도 있기때문이다.

    public class VariableScopeExam {
        int globalScope = 10; 

        public void scopeTest(int value){
            int localScope = 20;            
            System.out.println(globalScope);
            System.out.println(localScope);
            System.out.println(value);
        }   
        public static void main(String[] args) {
            System.out.println(globalScope);  // 오류
            System.out.println(localScope);   // 오류
            System.out.println(value);        // 오류  
        }   
    }
  • static

     앱이 실행되면서 종료되기 직전까지 사용될 여지가 있어야만 하는 모든것들이 여지가 있다.
      main 메소드는 static 이라는 키워드로 메소드가 정의되어 있다. 이런 메서드를 static 한 메소드 라고 한다.
      static한 필드(필드 앞에 static 키워드를 붙힘)나, static한 메소드는 Class가 인스턴스화 되지 않아도 사용할 수 있다.

    public class VariableScopeExam {
        int globalScope = 10; 
        static int staticVal = 7;

        public void scopeTest(int value){
            int localScope = 20;        
        }

        public static void main(String[] args) {
            System.out.println(staticVal);      // 사용가능 static한 값이라서 
        }

    }

static한 변수는 공유된다.
static한 변수들은 static하지않은 메소드 내에서 사용해도 문제가되지 않는다.

static한 메소드에서 static하지않은 변수들을 사용하려면 어떻게 해야할까
-> 객체를 생성하고 사용

 

public static void main(String[] args) {
    ValableScopeExam v1 = new ValableScopeExam();
    ValableScopeExam v2 = new ValableScopeExam();
    v1.golbalScope = 20;
    v2.golbalScope = 30; 

    System.out.println(v1.golbalScope);  // 20 이 출력된다. 
    System.out.println(v2.golbalScope);  // 30이 출력된다. 

    v1.staticVal = 10;
    v2.staticVal = 20; 

    System.out.println(v1.statVal);  // 20 이 출력된다. 값이 하나만 저장되기 때문
    System.out.println(v2.statVal);  // 20 이 출력된다. 
    System.out.println(VariableScopeExam.staticVal); // 이렇게 사용해야함 클래스변수
}

 

  • 인스턴스 변수, 클래스 변수

golbalScope같은 변수(필드)는 인스턴스가 생성될때 생성되기때문에 인스턴스 변수라고 한다.
static한 필드는 인스턴스 생성시에 만들어지는 것이 아니고 값을 저장할수 있는 공간이 하나다. 즉 값을 공유한다.
staticVal같은 static한 필드를 클래스 변수라고 한다. 
클래스 변수는 레퍼런스.변수명 하고 사용하기 보다는 클래스명.변수명 으로 사용하는것이 더 바람직하다.
->인스턴스가 생성되지 않아도 사용할수 있기때문에
VariableScopeExam.staticVal

  • 열거형(enum)

      자바는 열거타입을 이용하여 변수를 선언할 때 변수타입으로 사용할 수 있다.
      열거형은 JDK5에서 추가되었다.
      JDK5 이전에는 상수를 열거형 대신 사용

     상수를 사용했때의 문제점
     String으로 선언된 gender1 에는 MALE,FEMALE 둘 중 한가지 값을 갖기 원하는데, 

     gender1의 type이 String 이기 때문에 gender1 = "소년"; 이렇게 수행 되어도 전혀 문제가 되지 않는다.
     실행할때 원했던 값인 MALE,FEMALE 이 아닌 다른 값이 들어오게 되므로 문제를 발생시킬 수 있다.

해결 방법
이런 문제를 발생시키지 않게 하기 위해서 열거형을 사용하시면 됩니다.

 public class EnumExam {
        public static final String MALE = "MALE"; // 상수를 열거형 대신 사용
        public static final String FEMALE = "FEMALE"; // 상수를 열거형 대신 사용

        public static void main(String[] args) {
            String gender1; // gender1 이라는 변수는 MALE, FEMALE 둘중 한가지 값만 가지게 하고싶을땐 어떻게할까?
            
            gender1 = EnumExam.MALE; // static한 필드는 객체를 생성하지 않아도 사용가능. 클래스명.으로 접근가능
            gender1 = EnumExam.FEMALE;
           
            gender1 = "boy"; // MALE, FEMALE이 아닌 다른 String값이 들어와도 컴파일됨.
            //gender1는 String타입이기 때문이다. 원한건 이게아님. 그래서 열거형 enum사용
            
            Gender gender2;
            gender2 = Gender.MALE;
            gender2 = Gender.FEMALE;
            
            gender2 = "boy"; // 컴파일 에러     
        }
    }
    // 열거형 정의방법
    enum Gender{
        MALE, FEMALE;  
    }


 Gender타입의 변수에는 MALE이나 FEMALE만 대입이 가능. 다른 값은 저장할 수가 없다. 

  • 생성자

      모든 클래스는 인스턴스화 될때 생성자를 사용한다.
      new 뒤에는 생성자가 반드시 와야한다.

생성자의 특징
생성자는 리턴타입이 없다.
생성자를 프로그래머가 만들지 않으면 매개변수가 없는 생성자가 컴파일할 때 자동으로 만들어진다.
매개변수가 없는 생성자를 기본생성자라고 한다.
생성자를 하나라도 프로그래머가 만들었다면 기본생성자는 자동으로 만들어지지 않는다.

생성자의 역할
생성자가 하는 일은 객체가 될 때 필드를 초기화 하는 역할을 수행한다.
자동차가 객체가 될때 반드시 이름을 가지도록 하려면,Car클래스를 다음과 같이 만들어야 한다.
 

  public class Car{
        // 타입 필드명
        String name;
        int number;

        public Car(String n){
            name = n;
        }
    }

 //////////////위 아래 다른파일/////////////////


 위의 Car 클래스를 이용하여 Car 인스턴스를 생성하는 방법

public class CarExam2 {

public static void main(String[] args) {
//car c1 = new Car(); // 위의 public Car(String n) {name = n;} 생성자를 만들어서 컴파일 오류가생김
// 더이상 기본생성자를 사용하지 못한다.
car c2 = new Car("소방차");
car c3 = new Car("구급차");
System.out.println(c2.name); // 결과값 = 소방차
System.out.println(c3.name); // 결과값 = 구급차
	}
}

this
this는 현재 객체, 자기 자신을 나타낸다.

this 의 사용

    public class Car{
        String name;
        int number;

        public Car(String n){
            name = n;
        }
    }

Car클래스의 생성자 매개변수의 이름이 n 이다. n 이라는 변수명은 무엇을 의미하는지 쉽기 알수 없다.
n 으로 쓰기 보다는 name 으로 사용하는 것이 좋다.
  

public Car(String name){
        name = name;
    }

'name=name' 이라고 코드를 바꾸면, 가깝게 선언된 변수를 우선 사용하기 때문에 'name=name'이라는 코드는 매개변수의 name의 값을 매개변수 name에 대입하라는 의미가 된다.
즉, 필드는 바뀌지 않습니다. 이런 경우 필드라는 것을 컴파일러와 JVM에게 알려주기 위해서 this키워드를 사용해야 한다.

 public Car(String name){
        this.name = name;
    }

앞의 this.name은 필드 name을 말하고 =(이퀄) 뒤의 name은 매개변수를 의미한다.
즉 매개변수의 값을 필드에 대입하라는 의미가 된다.

클래스 안에서 자기 자신이 가지고 있는 메소드를 사용할 때도 this.메소드명()으로 호출할 수 있다.
나의 생성자를 호출할 때도 this.생성자로 호출할 수 있다.

  • 메소드 오버로딩

      매개변수의 개수나 타입이 조금씩 다르지만 비슷한 기능을 하는 메소드여러개 있을 수 있다.
      이런 메소드가 각각 다른이름으로 정의되어 있다면 어떨때 어떤 메소드를 사용해야 하는지 구분하기 힘들다.
      매개변수의 수, 타입이 다른 경우에 동일한 이름으로 메소드를 여러개 정의할 수 있다.

이름은 같지만 매개변수가 다른 메소드

    class MyClass2{
        public int plus(int x, int y){
            return x+y;
        }

        public int plus(int x, int y, int z){ // 매개변수의 수가 달라짐
            return x + y + z;
        }

        public String plus(String x, String y){ // 매개변수의 타입이 달라짐
            return x + y;
        }
    }

메소드 오버로딩은 매개변수 부분이 달라야 한다.
  

public int plus(int i, int f){ // 매개변수의 이름은 중요하지않다.
        return i+f;
    }

위처럼 변수명은 다르지만, 매개변수의 타입과 개수가 동일한 메소드를 또 정의 할 수는 없다.

오버로딩된 메소드 이용하기
메소드의 인자에 어떤 값이 쓰이느냐에 따라서 각기 다른 메소드가 호출된다.

    public MethodOverloadExam{
        public static void main(String args[]){
            MyClass2 m = new MyClass2();
            System.out.println(m.plus(5,10)); // 15
            System.out.println(m.plus(5,10,15)); // 30
            System.out.println(m.plus("hello" + " world")); // helloworld
        }
    }

 

  • 생성자 오버로딩

      생성자의 매개변수의 유형과 개수가 다르게 하여 같은 이름의 생성자를 여러 개 가질 수 있다.
      생성자도 메소드와 마찬가지로 여러개를 선언할 수 있다.
      매개변수의 수와 타입이 다르다면 여러개의 생성자를 선언할 수 있다.

 public class Car{
        String name;
        int number;

        public Car(){

        }

        public Car(String name){
            this.name = name;
        }

        public Car(String name, int number){
            this.name = name;
            this.number = number;
        }
    }

오버로딩된 생성자 이용하기

    public class CarExam4{
        public static void main(String args[]){
            Car c1 = new Car();
            Car c2 = new Car("소방차");
            Car c3 = new Car("구급차", 1234);
        }
    }


자기 생성자 호출하는 this()
기본생성자를 호출하였을 때 name을 "이름없음" , 숫자를 0으로 초기화 하기
상단의 코드를 확인하세요.

    public Car(){
        this.name = "이름없음";
        this.number = 0;
    }

위처럼 작성했을 경우 코드의 중복이 일어난다. (this.name, this.number)
자신이 가지고 있는 다른 생성자를 이용할 수 있다.

    public Car(){
        this("이름없음", 0); // 자신의 생성자를 호출, 타입과 개수를 보고 알맞는 생성자를 호출 가능하다. 중복의제거
    }

this괄호 열고로 시작하면 자신의 생성자를 호출하는 것이다.
자기 자신의 생성자를 호출함으로써 비슷한 코드가 중복되서 나오는 것을 방지할 수 있다.

  • 패키지

      패키지(package)란 서로 관련이 있는 클래스 또는 인터페이스들을 묶어 놓은 묶음이다.

      패키지를 사용함으로써 클래스들이 필요할 때만 사용될 수 있도록 하고,
      클래스를 패키지 이름과 함께 계층적인 형태로 사용함으로써 다른 그룹에 속한 클래스와

      발생할 수 있는 클래스 이름간의 충돌을 막아줌으로 클래스의 관리를 편하게 해준다.

패키지 정의방법
package이름은 보통 도메인 이름을 거꾸로 적은 후, 그 뒤에 프로젝트 이름을 붙여서 만든다. 물론, 프로젝트 이름 뒤에 또 다른 이름이 나올 수도 있다.
package이름은 폴더명 점 폴더명 점 폴더명 과 같은 형식으로 만들어진다. 각각의 폴더명은 숫자로 시작할 수 없다.
도메인 이름이 8cruz.com 이고 프로젝트 이름이 javastudy 라면 com.eightcruz.javastudy.Hello 로 패키지를 지정 할 수 있다.
도메인이 숫자로 시작되는데 패키지명은 첫글자에 숫자를 사용할 수 없으므로 적절하게 수정한다.
도메인으로 사용하는 이유는 패키지가 중복되는것을 방지하기 위함이므로, 반드시 존재하는 도메인이 아니라도 상관없다.

이클립스에서 패키지 생성하기
소스폴더를 선택한 후 우측버튼을 클릭하여 패키지 생성을 선택한다.
패키지 이름에 com.helloWorld.javastudy를 입력한다.
해당 패키지를 선택하고 Hello클래스를 작성한다.
작성된 클래스 파일의 첫줄에 package com.eightcruz.javastudy.Hello; 생성된것을 볼 수 있다.
패키지를 생성하는 예약어는 package 다.

패키지에 생성된 클래스 사용하기
java.lang패키지를 제외하고는 다른 패키지에 있는 클래스를사용하려면 import라는 구문을 적어줘야 한다.
import com.eightcruz.javastudy.Hello;
위의 코드는 com.eightcruz.javastudy패키지 아래의 Hello클래스를 사용하겠다는 것을 컴파일러와 JVM에게 알리는 것이다.
클래스 이름대신에 * 를 적어도 된다. import com.eightcruz.javastudy.*; -> 패키지 안에있는 모든 클래스를 사용할거다. 에스터리스크 = *

import 하지 않고 사용하는 방법
만약 import를 하기 싫다면, 혹은 각기 다른 패키지에 존재하는 같은 이름의 클래스 파일을 사용해야 한다면 아래와 같이 이용한다.
com.eightcruz.javastudy.Hello hello = newe com.eightcruz.javastudy.Hello(); 이렇게 사용한다.

 

 

16. 자바 레퍼런스(Reference)와 Null

이 포스트에서는 null을 이해하기 위한 최소한의 정보(JVM 메모리)에 대해 설명하고 null에 대해 설명하도록 한다. 예상 독자는 자바를 막 배우기 시작한 개발자들이므로 가상메모리를 실제메모리

imasoftwareengineer.tistory.com

 

반응형