[Java] 클래스, 객체, 정적, 접근제어자, 싱글톤, MVC

JH·2023년 3월 21일

Java

목록 보기
2/21

1. TIL

A. 클래스 (Class)

1. 클래스와 객체

  • 클래스 : 객체를 정의해 놓은 것 (설계도)

  • 클래스의 용도 : 객체를 생성하는데 사용됨

  • 클래스의 필수요소 : 멤버(필드), 메소드, 생성자

  • 객체 : 실제로 존재하는 것 (사믈 또는 개념)

  • 객체의 용도 : 객체의 속성과 기능에 따라 다름

a. 객체와 인스턴스

  • 객체 ≒ 인스턴스

  • 객체(object)는 인스턴스(instance)를 포함하는 일반적인 의미

  • 인스턴스화(instantiate)
    클래스로부터 인스턴스를 생성하는 것


객체는 속성과 기능으로 이루어져 있다.

  • 객체는 속성과 기능의 집합이며, 속성과 기능을 객체의 멤버(member, 구성 요소)라고 한다.

속성은 변수로, 기능은 메서드로 정의한다.

  • 클래스를 정의할 때 객체의 속성은 변수로, 기능은 메서드로 정의한다.

예시

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()
        }


2. 사용자 정의 생성자, this, overloading, getter, setter

예시

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);


B. 객체 (Object)

1. 객체의 생성 순서

  • 멤버 변수 (필드) -> 생성자 -> 메소드 (호출을 할 때)

예시

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가 먼저 생성됨


C. 정적 (Static)

1. Static

  • '고정'이라는 의미를 가지며 객체 소속이 아닌 클래스 소속

  • 객체 생성 없이도 사용 가능(클래스 로딩 -> 메모리상 적재)

  • 구조 및 종류
    • static 타입 변수
    • static 리턴타입 메소드

  • 사용 : 공용 데이터 값 지정 -> 상수 Constant, DB 연결, ...

예시

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
	}
}


D. 접근제어자 (access modifier)

a. 적용되는 위치

  • 클래스 선언구 : public, default

  • 변수 선언구 : public, protected, default, private

  • 생성자 선언구 : public, protected, default, private

  • 메소드 선언구 : public, protected, default, private

b. 호출가능한 범위 제한

  • public : 동일한 클래스, 동일한 package, 외부 package에서 호출 가능

  • protected : 동일한 클래스, 동일한 package,
    단, 상속관계의 외부 package의 클래스에선 호출 가능

  • default[friendly] : 동일한 package에서만 access 가능

  • private : 동일한 class 내에서만 access 가능

c. 기타 modifier

1. static

  • 변수 - 공유자원
  • 메소드 - 객체 생성없이 메소드 호출 가능 기능만 제공
  • static{} - 공유자원 단 1번 실행, byte code가 로딩시 단 한번 실행
  1. abstract : - 추상

  2. final

  3. synchronized

* modifier가 사용된 자바의 첫번째 특성 캡슐화 (객체 지향)

* 캡슐화 : 객체의 필드에 직접 접근하지 못하도록 막아주는 행위

* 값을 바꿀 때 getter, setter 사용



E. Singleton

싱글톤 패턴(Singleton Pattern)

  • 하나의 객체 만 만들어서 내부적인 메소드 혹은 정보를 사용하는 경우

  • 동일한 자원이나 데이터를 처리하는 객체가 불필요하게 여러 개 만들어질 필요가 없는 경우에 주로 사용

예시

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 


MVC패턴

MVC패턴 Start View : Start View의 요청을 Controller로 전해줌

Controller : 요청한 처리 결과를 End View에 전달함

Model : CRUD의 설계도

(DB) : 데이터 저장

End View : 처리 결과를 출력


2. 에러

vs code에서는 워크스페이스에 파일을 올려놓기만 해도 import되었지만 이클립스는 새로고침을 해도 되지 않음

상단바의 파일에서 import를 클릭해서 해결함


3. 보완 해야 할 것

static, 접근제어자 (private ~ public) 활용이 잘 떠오르지 않는다.
아직 singleton은 자세하게 배우지 않아 낯설다.


4. 느낀점

JavaScript에서의 객체 지향과 비슷한 느낌이 들지만 더욱 까다롭게 느껴진다.
까다로운 만큼 여러 에러들을 미리 방지해줄 것 같음

profile
잘해볼게요

0개의 댓글