티스토리 뷰

클래스

클래스 정의하는 방법

클래스 : 객체 != 붕어빵틀 : 붕어빵

흔히 클래스와 객체 간 관계를 붕어빵틀 - 붕어빵 에 비유한다. 하지만 이는 적절한 비유가 아니다.
붕어빵틀 붕어빵 = new 붕어빵틀();
붕어빵 틀을 하나 만들었더니 붕어빵이 되었다? 뭔가 이상하다.

클래스는 ‘분류’를 위한 개념으로 이해하는 것이 적절하다.
사람 김연아 = new 사람();

클래스는 같은 특성을 지닌 여러 객체를 총칭하는 집합의 개념이다.

클래스 정의 방법

속성 : 객체들이 가진 공통된 특성 중, 명사로 표현되는 특성.
메서드 : 객체들이 가진 공통된 특성 중, 동사로 표현되는 특성.

  • modifiers
    • private
    • default (접근 지시자를 명시하지 않는 경우) : 동일한 패키지 내에서만 객체 생성 가능
    • protected
    • public : 다른 패키지에서도 객체 생성 가능
  • class keyword
  • Class name : 대문자로 시작
  • Superclass(option) : 최대 하나의 superclass만 extends
  • Interfaces(option) : 하나 이상의 interface 도 implements
  • body : { } 으로 둘러쌓는다.

객체 만드는 방법 (new 키워드 이해하기)

클래스명 변수명;                //참조변수 선언
변수명 = new 클래스명();        //객체 생성 후 객체의 주소를 참조변수에 저장

class-study

메소드 정의하는 방법

  • Modifiers -> 추후 ‘접근지시자’ 학습 시 다룰 예정
    • public
    • private
    • protected
    • default
  • Return type
  • Method name : by convention, verb in lowercase
  • Parameter list in parenthesis
  • Exception list : method 내부에서 exception을 처리하지 않고 상위 call stack으로 throw 하고 싶을 경우, throws Exception, ... 으로 명시
  • Method body

생성자 정의하는 방법

  • method 만드는 방법과 유사
    • method 와 달리, return type이 없음
    • class name을 그대로 사용
    • modifier className(parameter list)
  • instance를 만들 때 사용되는 코드.
    • heap 영역에 공간을 할당하고, 객체의 field값을 initialize
  • 생성자를 정의하지 않으면, compiler가 자동으로 argument가 없는 생성자를 만든다.
    • 이러한 default constructor는 superclass의 no-argument constructor를 호출. 따라서, superclass에 no-argument constructor가 있는지 확인하는 작업 필요. -> 없으면 compile error 발생

this 키워드 이해하기

  • instance method, constructor 에서 사용
  • 현재 object를 가리킴(reference)
    • 현재 object 내 member 로 접근 가능
  • Field와 관련해서 사용
    • method 나 constructor의 parameter에 의해 field 가 가려질 때 사용
public class Point {
    public int x = 0;
    public int y = 0;

    //constructor
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}
  • Constructor 에서 사용
    • 같은 클래스 내 다른 constructor 호출 시 사용
public class Rectangle {
    private int x, y;
    private int width, height;

    public Rectangle() {
        this(0, 0, 1, 1);
    }
    public Rectangle(int width, int height) {
        this(0, 0, width, height);
    }
    public Rectangle(int x, int y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }
    ...
}

패키지

package 키워드

Class 를 그룹화해서 package 단위로 묶는다.

  • class를 쉽게 찾고 쉽게 쓰기 위함
  • naming conflict 를 피하기 위함
  • 접근 권한 설정하기 위해

물리적으로 패키지는 클래스 파일을 포함하는 하나의 디렉토리이다.

package 생성 방법

  • source file 맨 위에 package 를 명시

    package graphics;
    public class Circle {
    
    }
  • 클래스와 구분하기 위해서 소문자로 하는 것이 원칙.

  • 패키지를 지정하지 않은 클래스는 모두 ‘이름 없는 패키지’에 속하게 된다.

import 키워드

소스코드 작성시 다른 패키지의 클래스를 사용하려면 패키지명이 포함된 클래스 이름을 사용해야 한다. 이는 매우 번거롭다.
-> import 문으로 사용하고자 하는 클래스의 패키지를 명시해놓으면 클래스를 사용할 때 패키지 명을 생략할 수 있다.

import 와 performance 관계

Import 패키지명.*; 을 쓰면 performance에 영향을 줄까?
-> 그렇지 않다. Compile time이 늘어날 순 있어도, run time에는 영향이 없다. 컴파일러가 import 문을 보고, 소스파일에 사용된 클래스들의 패키지를 알아 낸 다음, 모든 클래스이름 앞에 패키지명을 붙여주기 때문이다.

그럼에도,

  • 가독성
  • 의도치않은 collision을 피하기 위해

Import 패키지명.*; 을 지양하는 것이 좋다.

static import

Static 멤버를 호출할 때 클래스 이름을 생략할 수 있다.

import static java.lang.Math.random;

System.out.println(random());        //Math.random() 축약 가능

클래스패스

  • 컴파일된 클래스 파일이 위치한 경로.
  • JVM이 빠르게 클래스 파일을 찾을 수 있도록, 클래스 파일이 위치할 수 있는 곳을 list 형태로 지정해놓은 것. ‘:’(colon) 을 이용해서 구분.
  • 클래스패스로 올 수 있는 것
    • 디렉토리 (package 구조 중 root가 위치한 곳까지 명시)
    • zip 파일
    • jar 파일
      가령, 클래스파일이 output 이라는 디렉토리에 위치하고, 찾고자하는 클래스가 org.java.study.Myclass 라면, classpath 에는 단순히 ...../output 까지만 명시하면 된다. 그 이후 경로는 JVM이 import문을 보고 추적할 수 있다.

클래스패스를 지정할 수 있는 두 가지 방법

(1) CLASSPATH 환경변수

Machine 에 CLASSPATH 를 환경변수로 등록해놓는다.
-> 전역변수와 같은 이유로 지양하는 것이 좋음. 다시 말해, 하나의 프로그램에서 잘 동작하도록 환경변수를 바꿨을 떄, 다른 프로그램에서는 동작하지 않는 문제가 생길 수 있음.

(2) -classpath 옵션

Java 실행시 -cp option을 추가.
e.g.
java -cp "/home/usr/myproject/output" MyMainClass

접근지시자

  • private : 같은 클래스 내에서만 접근 가능
  • default : 같은 패키지 내에서만 접근 가능
  • protected : 같은 패키지 내 or 다른 패키지의 자손 클래스에서 접근 가능
  • public : 어디서든 접근 가능

접근지시자를 사용하는 이유

  • 외부로부터 데이터를 보호
  • 클래스 내부적으로만 사용되는 부분을 감추기 위해

Getter & Setter

멤버변수의 접근 지시자를 private이나 protected로 제한하고, 대신에 멤버변수 값을 읽거나 변경하는 메서드를 public 하게 제공하는 방법.
-> Getter 와 Setter에서 조건에 맞을 때만 값을 읽거나 변경하도록 코드를 작성할 수 있음.

생성자와 접근지시자 : singleton

생성자에 접근 제어자를 사용해서 인스턴스의 생성을 제한할 수 있다.

Class Singleton{
    private static Singleton s = new Singleton();

    private Singleton(){    //외부에서 직접 인스턴스 생성 불가
    }

    //인스턴스를 생성하지 않고도 호출할 수 있어야 하므로 static으로 선언
    public static Singleton getInstance(){
        return s;
    }

}

Singleton을 언제 사용하는가?

  • 매번 새로운 객체를 만들 필요가 없는 경우. Singleton 객체를 static 영역에 하나 만들어놓고, 이를 재활용하면 효율적.
    e.g. util성 객체
  • 전체 application에서 resource를 share하고 싶은 경우.
    e.g. repository

References

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
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
글 보관함