티스토리 뷰
클래스
클래스 정의하는 방법
클래스 : 객체 != 붕어빵틀 : 붕어빵
흔히 클래스와 객체 간 관계를 붕어빵틀 - 붕어빵 에 비유한다. 하지만 이는 적절한 비유가 아니다.붕어빵틀 붕어빵 = new 붕어빵틀();
붕어빵 틀을 하나 만들었더니 붕어빵이 되었다? 뭔가 이상하다.
클래스는 ‘분류’를 위한 개념으로 이해하는 것이 적절하다.사람 김연아 = new 사람();
클래스는 같은 특성을 지닌 여러 객체를 총칭하는 집합의 개념이다.
클래스 정의 방법
속성 : 객체들이 가진 공통된 특성 중, 명사로 표현되는 특성.
메서드 : 객체들이 가진 공통된 특성 중, 동사로 표현되는 특성.
- modifiers
private- default (접근 지시자를 명시하지 않는 경우) : 동일한 패키지 내에서만 객체 생성 가능
protected- public : 다른 패키지에서도 객체 생성 가능
- class keyword
- Class name : 대문자로 시작
- Superclass(option) : 최대 하나의 superclass만 extends
- Interfaces(option) : 하나 이상의 interface 도 implements
- body :
{ }
으로 둘러쌓는다.
객체 만드는 방법 (new 키워드 이해하기)
클래스명 변수명; //참조변수 선언
변수명 = new 클래스명(); //객체 생성 후 객체의 주소를 참조변수에 저장
메소드 정의하는 방법
- 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
- Trail: Learning the Java Language (The Java™ Tutorials)
- 스프링 입문을 위한 자바 객체 지향의 원리와 이해
- 자바의 정석
- https://stackoverflow.com/questions/2396493/what-is-a-classpath-and-how-do-i-set-it
'JAVA' 카테고리의 다른 글
[자바 스터디] 7주차 : 인터페이스 (0) | 2022.02.06 |
---|---|
[자바 스터디] 6주차 : 상속 (0) | 2022.01.30 |
[자바 스터디] 4주차 : 제어문 (0) | 2022.01.15 |
[자바 스터디] 3주차 : 연산자 (0) | 2022.01.07 |
[자바 스터디] 2주차 : 자바 데이터 타입, 변수 그리고 배열 (0) | 2022.01.01 |
- Total
- Today
- Yesterday
- provider
- 자바스터디
- 데코레이터패턴
- 디자인패턴
- 백기선
- 프록시
- 코테
- 카카오
- 예외처리
- 서비스추상화
- AOP
- 토비의스프링
- 프록시패턴
- 메서드레퍼런스
- 스프링
- 템플릿콜백
- 프로그래머스
- 토비의봄TV
- gracefulshutdown
- SOLID
- ec2
- java
- 코딩테스트
- 자바
- 토비
- BOJ
- OOP
- c++
- 김영한
- 객체지향
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |