[JAVA 언어] 클래스, 객체지향

최수정·2023년 8월 23일
0

이것이 JAVA다

목록 보기
9/10

관계

image-20230822125154562

  1. 집합관계
  2. 사용 관계
  3. 상속관계

클래스

  • 라이브러리 클래스 : 실행 x, 다른 클래스에서 이용하는 클래스

    실행 클래스 : main() 메서드를 가진 실행 가능한 클래스

  • new 연산자

    • 클래스로부터 객체를 생성하며 연이어 생성자를 호출해서 객체를 초기화하는 역할

      클래스 변수 = new 클래스 ();

      Scanner sc = new Sccaner(System.in);

  • 구성

    • 필드 : 객체의 데이터가 저장되는 곳
    • 생성자 : 객체 생성 시 초기화 역할 담당, new 연산자로 객체를 생성할 때 초기화함
    • 메서드 : 객체의 동작으로 호출 시 실행하는 블록, 객체와 객체간의 상호작용을 위해 호출됨
    public class Example {
    	//필드
    	int fieldName;
    	//생성자 선언
    	Eaxmple() {...}
    	//메서드 선언
    	int methodName() {...}
    }

1. 필드

  • 초기값을 제공하지 않을 경우, 필드는 객체 생성 시 자동으로 기본값으로 초기화 된다. (int type -> 0, String type -> null .... )
  • image-20230823131006727

2. 생성자

  • 클래스에 생성자 선언이 없으면 컴파일러는 기본 생성자(Defalt Constructor)를 바이트코드 파일에 자동추가한다.

  • new 연산자로 생성자를 호출할 때, 매개변수를 통해 매개값을 생성자 블록 내부로 전달.

    public class Cosmetic {
        int price;
        String color;
        String type = "cosmetic";
        
    	Cosmetic (int price, String color) {
           this.price = price;
           this.coloe = coloe;
        }
    }
    // 다른 클래스에서 Cosmetic 객체 생성 시,
    Cosmetic c = new Cosmetic(500, red);
  • this 활용

    git

3. 메서드

  • 리턴타입 메서드명 (매개변수,...,) {...}

  • 가변인자 : 내부적으로 배열을 생성해서 사용함 , 오버로딩시, 컴파일러의 혼란을 야기할 수 있어 가변인자 메서드엔 오버로딩 사용 지양.

    ex) print 메서드

    void method(String...srt) {...}
    
    .method("hi","gi","fi");
    .methid(new String[] {"hi","gi","fi"});

Static , Instance

  • Instance - 객체 소속 멤버 / 객체 생성 후 사용

  • Static - 클래스 고정 멤버 / 객체 생성 없이 사용 가능 : 객체마다 가지고 있을 필요성이 없는 공용적 필드

  • 객체는 힙 영역에, 메서드는 메서드 영역에. 클래스로더는 클래스를 메소드 영역에 저장하고 사용하므로 정적 필드/메서드는 메서드 영역에서 사용된다.

    따라서 인스턴스 필드를 이용하지 않는 메소드는 정적 메소드로 선언하는 것이 좋다.

    public class Calculator {
    	String color;
        static double pi = 3.14159; 
    	void serColor(String color) {this.color = color}; // 내부 인스턴트 필드를 사용
    	static int plus(int x, int y) {return x + y;} // 외부 매개변수만을 가지고 동작하므로 static이 좋음
    }
  • 정적 필드, 메서드 접근법 -> . 도트 연산자

    result = Calculator.plus(1,2);
    result2 = 10 * 10 * Calculator.pi;
  • 정적 메서드/블록은 객체가 없어도 실행된다는 특징 때문에 내부에 인스턴스 필드/메서드를 사용 할 수 없으며 객체 자신의 참조인 this도 사용할 수 없다.

    객체를 새로 생성 후 참조변수로 접근하는 것은 가능 . main() 생각하면 쉬움

    static void method() {
    	instanceField = 10; // [x]
    	this.instanceField = 10; // [x]
        instanceMethod(); // [x]
        // 🔽 올바른 방법. 
        ClassName obj = new ClassName();
        obj.instanceField = 10; 
    }

final 필드, 상수 (static final)

  • 값을 변경하는 것을 막기 위한 기능
  • 초기화 방법
    1. 필드 선언 시, 대입
    2. 생성자에서 대입

Getter Setter

객체의 필드를 외부에서 수정이 가능할 경우, 객체의 무결성이 깨진다.

해결 방법으로, private로 필드 접근을 막고, 메서드를 통해 필드에 접근하는 방식을 취한다. 메서드를 통해 유효한 값만 필드로 저장되도록 제어가 가능하기 때문 --> setter()

싱글톤 패턴

  • 애플리케이션 전체에서 단 한 개의 객체만 생성해서 사용하고 싶을 때 싱글톤 패턴 적용

  • 생성자를 private로 접근 제한하고, 외부에서 new 연산자로 생성자를 호출 할 수 없게한다.

    대신, 정적 메서드를 통해 간접적으로 만들어진 객체를 얻을 수 있다.

  • public class Example {
        private static Example ex = new Example(); // 이 만들어진 static 객체를 하나로 사용할것임. static으로 해야 객체가 실행과 동시에 만들어짐. 
        private Example() {} // 생성자를 private 적용해서, 외부에서 new 연산자로 불러오기 불가능  
    	// public 접근 권한을 갖는 정적 메서드 선언, 외부에선 이 메서드로 만들어진 객체에 접근. static -> static 영역에서 힙 영역을 참조할 수 없다' 는 자바 문법 사항 때문
    	public static Example getInstance() {
    		return ex;
    	}
    }
  • git

0개의 댓글