일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 해커톤
- deep learning
- LG Aimers
- 머신러닝
- gpt
- OpenAI
- Machine Learning
- regression
- 지도학습
- 티스토리챌린지
- supervised learning
- 회귀
- AI
- LG
- 딥러닝
- ChatGPT
- 분류
- GPT-4
- 오블완
- LG Aimers 4th
- Classification
- LLM
- PCA
Archives
- Today
- Total
SYDev
[혼자 공부하는 자바] Chapter 6. 클래스 본문
1. 객체 지향 프로그래밍(OOP: Object-Oriented Programming)
- 객체: 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서, 자신의 속성을 가지고 있으면서 식별 가능한 것
- 자바에서의 객체 = field(속성) + method(동작)
1. 1. 객체 간의 관계
- 집합 관계: 부품 - 완성품
- 사용 관계: 객체 간의 상호작용
- 상속 관계: 종류 - 사물
1.2. 클래스 선언
- public 접근 제한자: 파일 이름과 동일한 이름의 클래서 선언에만 붙일 수 있음
- 보통 소스 파일 하나당 동일한 이름의 클래스 하나를 선언
public class Student {
}
1.3. 객체 생성과 클래스 변수
- 클래스는 두 가지 용도가 존재
- 라이브러리 클래스(Student)
- 실행 클래스(StudentExample)
public class StudentExample {
public static void main(String[] args) {
Student s1 = new Student();
System.out.println("s1 변수가 Student 객체를 참조합니다.");
Student s2 = new Student();
System.out.println("s2 변수가 또 다른 Student 객체를 참조합니다.");
}
}
1.4. 클래스의 구성 멤버
- 필드: 객체의 데이터가 저장되는 곳
- 객체의 소멸 시점에 함께 소멸
- 생성자: 객체 생성 시 초기화 역할 담당
- 클래스이름과 동일
- 리턴타입 X
- 메소드: 객체의 동작에 해당하는 실행 블록
2. 필드
3. 생성자
package ch6;
public class Korean {
// 필드
String nation = "대한민국";
String name;
String ssn;
// 생성자
public Korean(String n, String s) {
name = n;
ssn = s;
}
// 생성자 오버로딩
public Korean(String n, String s, String nat) {
name = n;
ssn = s;
nation = nat;
}
}
3.1. 다른 생성자 호출: this()
package ch6;
public class Korean {
// 필드
String nation;
String name;
String ssn;
public Korean(String n) {
this(n, "111111-1111111", "대한민국");
}
public Korean(String n, String s) {
this(n, s, "대한민국");
}
// 공통 실행 생성자
public Korean(String n, String s, String nat) {
name = n;
ssn = s;
nation = nat;
}
}
4. 메소드
- 메소드 선언은 선언부와 실행 블록으로 구성됨
- method 선언부를 method signature라 부름
package ch6;
public class Calculator {
// method
void powerOn() {
System.out.println("전원을 켭니다.");
}
int plus(int x, int y) {
return x + y;
}
double divide(int x, int y) {
double result = (double)x / (double)y;
return result;
}
void powerOff() {
System.out.println("전원을 끕니다.");
}
}
4.1. 매개 변수의 개수를 모를 경우
package ch6;
public class Computer {
int sum1(int[] values) {
int sum = 0;
for(int i = 0; i < values.length; i++) {
sum += values[i];
}
return sum;
}
// 가변인자 -> sum2(1, 2, 3, ...); 형태로 호출
int sum2(int ... values) {
int sum = 0;
for(int i = 0; i < values.length; i++) {
sum += values[i];
}
return sum;
}
}
5. 인스턴스 멤버와 정적 멤버
- instance member: 객체마다 가지고 있는 멤버 -> 객체를 생성한 이후 사용할 수 있는 field&method
- static member: 클래스에 위치시키고 객체들이 공유하는 멤버 -> 객체를 생성하지 않고도 사용 가능한 field&method
public class ClassName {
// static field
static type fieldName [= initialValue];
// static method
static returnType methodName( param, ... ) { ... }
}
- Heap 영역의 메모리는 GC에 의해 수시로 관리를 받음
- Static 영역은 모든 객체가 공유하여 사용할 수 있다는 장점이 있지만, GC에 의해 관리받지 못하기에 프로그램 종료 시점까지 메모리가 할당된 상태 유지 -> 적절한 상황에만 사용해야 함
5.1. Static Block
package ch6;
public class Television {
static String company = "MyCompany";
static String model = "LCD";
static String info;
static {
info = company + "-" + model;
}
}
package ch6;
public class TelevisionExample {
public static void main(String[] args) {
System.out.println(Television.info);
Television.company = "JustCompany";
Television.model = "LED";
System.out.println(Television.info);
}
}
- static block은 class 로드 시점에 한 번 초기화되기 때문에, 실행 시점에 company, model값을 임의로 변경해도 info의 값은 바뀌지 않는다.
5.2. Instance member 사용 불가
- static method&static block은 객체가 없어도 실행 가능 -> instance member 사용 불가능, 객체 자신의 참조인 this 사용 불가능
- 객체를 먼저 생성하고 참조 변수로 접근 시에 가능
static oid Method3() {
// 객체 생성
ClassName obj = new ClassName();
// 인스턴스 멤버 사용
obj.field1 = 10;
obj.method();
}
6. Final 필드와 상수
6.1. final 필드 선언
- final field: 초기값 = 최종값, 프로그램실행 도중 수정 불가능
- final field 초기화 방법 2가지
- 필드 선언 시에 초기값 대입
- 생성자에서 초기값 대입
6.2. 상수 선언
- 상수 초기화 방법 2가지
- 상수 선언 시에 초기화
- 선언 이후 static block에서 초기화
static final type 상수 [= initialValue];
7. 패키지
7.1. 패키지 선언
- 패키지 디렉토리는 클래스를 컴파일하는 과정에서 자동 생성
- 컴파일러는 클래스의 패키지 선언을 보고 디렉토리를 자동 생성
- 보통 회사 도메인 이름의 역순으로 작성, 마지막에는 프로젝트 이름을 붙여주는 것이 일반적
package 상위패키지.하위패키지;
public class 클래스명 { ... };
7.2. import 문
- 같은 패키지에 있는 클래스는 조건 없이 사용 가능
- 다른 패키지에 있는 클래스를 사용하려면 import 문을 이용하여 어떤 패키지의 클래스를 사용하는지 명시
- import문은 하위 패키지를 포함 X
8. 접근 제한자
접근 제한자 | 제한 대상 | 제한 범위 |
public | 클래스, 필드, 생성자, 메소드 | 없음 |
protected | 필드, 생성자, 메소드 | 같은 패키지거나, 자식 객체만 사용 가능 |
(default) | 클래스, 필드, 생성자, 메소드 | 같은 패키지 |
private | 필드, 생성자, 메소드 | 객체 내부 |
8.1. 클래스의 접근 제한
- public: 제한 X
- default: 같은 패키지에서만 사용 가능
8.2. 생성자의 접근 제한
- public: 제한 X
- default: 같은 패키지 내에서는 객체 생성 가능
- private: 클래스 내부에서만 객체 생성 가능
8.3. 필드와 메소드의 접근 제한
- public: 제한 X
- default: 같은 패키지에서만 사용 가능
- private: 클래스 내부에서만 사용 가능
9. Getter와 Setter
- 객체의 무결성 유지를 위해 사용
- Setter: 데이터를 검증하여 유효한 값만 필드에 저장
- Getter: 필드값을 적절히 가공하여 외부에서 사용
- boolean의 getter는 isName 형식 사용
10. 싱글톤 패턴
- application 전체에서 단 한 개의 객체만 생성해서 사용하는 경우
- 생성자를 private 접근 제한 -> new 연산자로 생성자 호출 방지
public class 클래스 {
// private 접근 권한을 갖는 정적 필드 선언과 초기화
private static 클래스 singleton = new 클래스();
// private 접근 권한을 갖는 생성자 선언
private 클래스() {}
// public 접근 권한을 갖는 메소드 선언
public static 클래스 getInstance() {
return singleton;
}
}
-> 같은 객체에 접근
참고자료
- 혼자 공부하는 자바, 신용권 저 | 한빛미디어 | 2019년 06월 10일
- 이것이 자바다, 신용권, 임경균 저 | 한빛미디어 | 2024년 04월 01일
- https://mangkyu.tistory.com/47
[Java] static변수와 static 메소드
1. Static 정리 Java에서 Static 키워드를 사용한다는 것은 메모리에 한번 할당되어 프로그램이 종료될 때 해제되는 것을 의미합니다. 이를 정확히 이해하기 위해서는 메모리 영역에 대한 이해가 필
mangkyu.tistory.com
'Programming Lang > Java' 카테고리의 다른 글
[혼자 공부하는 자바] Chapter 8. 인터페이스 (0) | 2025.01.29 |
---|---|
[혼자 공부하는 자바] Chapter 7. 상속 (0) | 2025.01.27 |
[혼자 공부하는 자바] Chapter 5. 참조 타입 (1) | 2025.01.18 |
[혼자 공부하는 자바] Chapter 4. 조건문과 반복문 (0) | 2025.01.18 |
[혼자 공부하는 자바] Chapter 3. 연산자 (0) | 2025.01.18 |