클래스 : 객체를 정의해 놓은 것 (설계도)
클래스의 용도 : 객체를 생성하는데 사용됨
클래스의 필수요소 : 멤버(필드), 메소드, 생성자
객체 : 실제로 존재하는 것 (사믈 또는 개념)
객체의 용도 : 객체의 속성과 기능에 따라 다름
객체 ≒ 인스턴스
객체(object)는 인스턴스(instance)를 포함하는 일반적인 의미
인스턴스화(instantiate)
클래스로부터 인스턴스를 생성하는 것
예시
package test01;
// 하나의 패키지 안에 클래스는 한 개만 있어야 함
class People {
// 1. 멤버 변수 (필드)
String name = "java"
// 2. (기본) 생성자
// 반환값이 없음, 클래스의 이름과 똑같아야 함
클래스의 필수 요소이고 생략이 가능함
People() {
}
// 3. 메소드
// 데이터 타입, 변수명, () {return}
// 타입을 정해주고 그 타입에 대한 값을 돌려줘야 함
// void를 사용하면 return 생략 가능
String getName() {
return name;
}
}
public static void main(String[] args) {
// 객체 생성 : 타입(클래스명), 변수명 = new 생성자명()
// 인스턴스 : 객체가 Heap 메모리 영역에 올라가 있을 때 인스턴스라 함
People java = new People()
}
예시
package test02;
// 하나의 패키지 안에 클래스는 한 개만 있어야 함
class People2 {
String name; // 초기 값으로 지정됨 null
int age; // 0, 인스턴스 변수
// 생성자 : 반환값이 없음, 클래스의 이름과 똑같아야 함, *클래스의 필수 요소
// 기본 생성자 : 다른 생성자 없는 경우에는 자동으로 만들어 줌!
People2() {}
// * 사용자 정의 생성자 *
// overloading : 기본 생성자에서 파라미터를 바꿔가면서 여러 형태 만드는 것
People2 (String name, int age) {
this.name = name;
this.age = age;
// this가 있으면 클래스가 갖고 있는 멤버 변수임
// this가 있으면 필드에 있다는 걸 직관적으로 알 수 있음
}
// getXXX : getter
String getName() {
return this.name;
}
// setXXX : setter
// setAge(int age)
void setAge (int age) {
if (age > 0) {
this.age = age;
}
}
void printInfo() {
System.out.println(name + " " + age);
}
// method overloading : 타입과 이름이 같고 파라미터만 다름
void printInfo(int number) {
System.out.println(name + " " + age);
}
}
public class Ex02People {
public static void main(String[] args) {
People2 java = new People2("java", 29);
System.out.println(java.name); // java
System.out.println(java.age); // 29
java.setAge(30);
System.out.println(java.age); // 30
}
타입은 같지만 다른 객체 (주소가 다름)
People2 ppl1 = new People2("ppl1", 29);
People2 ppl2 = new People2("ppl2", 29);
예시
package test02;
class A {
A() {
System.out.println("Class A");
}
}
class B {
// 멤버 변수, 필드
// A, a : 멤버 변수 (필드)가 메모리(stacks)에 먼저 올라가야 객체가 생성
A a = new A();
// 생성자
B() {
System.out.println("Class B");
}
// 메소드
void print() {
System.out.println("print");
}
}
public class TestObject {
public static void main(String[] args) {
// 객체 생성
// 타입(클래스), 변수 = new 객체();
B b = new B();
A a = new A();
}
}
// 출력
// Class A
// Class B
// Class A
main을 보면 B 객체가 생성되기 전 멤버 변수인 a가 먼저 생성됨
예시
package test02;
class Customer {
// 필드 (인스턴스 변수)
String name;
// 클래스 변수 (static 변수, 공유 변수)
static String company;
// static 변수를 초기화 (선언, 할당) 하기 위해 사용되는 블럭
static {
Customer customer = new Customer();
customer.name = "java";
company = "google";
}
// static 메소드
static void getCompany() {
System.out.println(company);
}
// final : 값이 바뀌면 안되는 값
// static final 상수
static final double PI = 3.14;
}
public class TestStatic {
public static void main(String[] args) {
// 인스턴스 만들기
Customer customer1 = new Customer();
System.out.println(customer1.name); // null : 초기값(기본값)
System.out.println(customer1.company); // google
Customer.getCompany(); // google (static 메소드)
System.out.println(Customer.PI); // 3.14
}
}
클래스 선언구 : public, default
변수 선언구 : public, protected, default, private
생성자 선언구 : public, protected, default, private
메소드 선언구 : public, protected, default, private
public : 동일한 클래스, 동일한 package, 외부 package에서 호출 가능
protected : 동일한 클래스, 동일한 package,
단, 상속관계의 외부 package의 클래스에선 호출 가능
default[friendly] : 동일한 package에서만 access 가능
private : 동일한 class 내에서만 access 가능
1. static
abstract : - 추상
final
synchronized
하나의 객체 만 만들어서 내부적인 메소드 혹은 정보를 사용하는 경우
동일한 자원이나 데이터를 처리하는 객체가 불필요하게 여러 개 만들어질 필요가 없는 경우에 주로 사용
예시
public class Singleton {
// private 필드 : 외부의 접근 제한
private static Singleton instance = new Singleton();
// private 생성자
// 외부에서 접근할 수 없도록 private으로 접근을 제한함
private Singleton () {}
// 메소드 : getInstance() : 외부에서 내부에 생성된 객체에 접근
// getInstance로 사용만 할 수 있게 함
public static Singleton getInstance() {
return instance;
}
// Singleton 테스트
public static void main(String[] args) {
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
// 출력을 보면 같은 객체임
System.out.println(singleton1); // @1d251891 같은 주소이므로 같은 객체임
System.out.println(singleton2); // @1d251891
Start View : Start View의 요청을 Controller로 전해줌
Controller : 요청한 처리 결과를 End View에 전달함
Model : CRUD의 설계도
(DB) : 데이터 저장
End View : 처리 결과를 출력
vs code에서는 워크스페이스에 파일을 올려놓기만 해도 import되었지만 이클립스는 새로고침을 해도 되지 않음
상단바의 파일에서 import를 클릭해서 해결함
static, 접근제어자 (private ~ public) 활용이 잘 떠오르지 않는다.
아직 singleton은 자세하게 배우지 않아 낯설다.
JavaScript에서의 객체 지향과 비슷한 느낌이 들지만 더욱 까다롭게 느껴진다.
까다로운 만큼 여러 에러들을 미리 방지해줄 것 같음