[Java] 클래스

MINJEE·2024년 1월 9일

SMHRD_8_Java

목록 보기
5/10
post-thumbnail

🔷 객체 지향 특성

  • 캡슐화
    • 클래스(class) : 객체 모양을 선언한 틀 (캡슐화하는 틀)
    • 객체 : 생성된 실체(instance), 클래스 내에 메소드/필드 구현
      class Animal {
      		String name; //필드(속성)
      		int age;  //필드(속성)
      		void eat() {...}  //메소드
      		void speak() {...}  //메소드
      }
  • 상속 : 상위 클래스(슈퍼 클래스)의 멤버를 하위 클래스(서브 클래스)가 물려받음
    class Human extends Animal {
    		String hobby;
    		String job;
    		void work() {...}
    		void cry() {...}
    		void laugh() {...}
    }
    // Human 클래스는 속성으로 name, age, hobby, job을, 메소드는 eat(),speak(),work(),cry(),laugh()
    • 서브 클래스 객체는 슈퍼 클래스의 멤버와 서브 클래스의 멤버 모두 가짐
  • 다형성 : 같은 이름의 메소드가 다른 클래스/객체에 따라 다르게 구현되는 것(오버로딩,오버라이딩)


🔷 클래스와 객체

  • 클래스 : 객체의 속성과 행위 선언, 객체의 틀 (ex. 소나타 자동차)
  • 객체 : 클래스의 틀로 찍어낸 실체 (ex. 출고된 실제 소나타 100대)
[클래스접근권한] class 클래스명{
		필드타입 필드명;
		[메소드접근권한] 결과타입 메소드명() {
				...
		}
		public static void main(String[] args) {

		}
}
  • 클래스명 클래스변수 = new 클래스명(); : 선언과 생성 동시에 (아래처럼 따로 가능)
    • 클래스명 클래스변수 ; : 클래스 객체의 레퍼런스 변수 선언
    • 클래스변수 = new 클래스명(); : 클래스 객체 생성 (new연산자 이용)
  • 클래스변수.멤버 : 객체 멤버 접근 (점(.)연산자 이용)
    • 멤버 : 클래스의 필드와 메소드
    • 클래스변수.필드명 = 값; : 필드에 값 대입
    • 클래스변수.메소드명(); : 메소드 실행
//예시 : 원의 넓이 구하는 클래스
public class Circle {
	int radius; // 멤버 필드(원의 반지름)
	String name; // 멤버 필드(원의 이름)
	
	public double getArea() { // 멤버 메소드 (원의 넓이 구하기)
		return 3.14*radius*radius;
	}
	
	public static void main(String[] args) {
		Circle pizza; //Circle객체 선언
		pizza = new Circle(); //Circle객체 생성
		// Circle pizza = new Circle(); (위의 두개 한번에 사용 가능)
		pizza.radius = 10;
		pizza.name = "자바피자";
		double area = pizza.getArea();
		System.out.println(pizza.name + "의 면적은 "+ area);
		
		Circle donut = new Circle(); //Circle객체 선언과 생성
		donut.radius = 2;
		donut.name = "자바도넛";
		area = donut.getArea();
		System.out.println(donut.name + "의 면적은 "+ area);
	}
}
  • Circle 클래스의 객체 2개 생성 → pizza객체, donut객체


🔷 생성자

  • 특징
    • 생성자 명은 클래스명과 동일
    • 여러 개 작성 가능
    • 객체 생성 시 한 번만 호출
    • 리턴 타입 지정 불가능

🔹 기본 생성자

: 매개변수 없고, 아무 작업 없이 단순 리턴하는 생성자
  • 클래스에 생성자가 하나도 선언되어 있지 않으면 컴파일러에 의해 자동 생성
    • 클래스에 생성자가 선언되어 있는 경우 자동 생성x
public class 클래스명 {
	필드타입 필드명;
	리턴타입 메소드명;
    
    public 생성자명() { } //생성자명 = 클래스명
    
    public static void main(String[] args) {
    	클래스명 변수명 = new 클래스명();  //이 때 컴파일러에 의해 위의 기본생성자 자동 삽입
        ...
    }
}

🔹 this

: 객체 자신에 대한 레퍼런스
  • this.멤버 형태로 객체의 멤버를 접근할 때 사용
  • 메소드에서 사용 (static 메소드에서는 사용 불가)
public class 클래스명 {
	필드타입 필드명;
    리턴타입 메소드명;
    
    public 생성자명() { }
    public 생성자명(필드타입 a){ // 보통 매개변수와 멤버필드명이 같을 때 사용
    	this.필드명 = a;
    }
    public static void main(String[] args) {
	    ...
    }
}

🔹 this()

: 같은 클래스의 다른 생성자 호출
  • 생성자 내에서만 사용 가능
  • 생성자 코드의 제일 처음에 있어야 함
// 예시 : 제목과 작가 출력하는 클래스
public class Book {
	String title; //멤버 필드(제목)
    String author; //멤버 필드(작가)
    void show() { System.out.println(title + " " + author); } //멤버 메서드(제목,작가 출력)
    
    public Book() { //생성자1
    	this("",""); //생성자3호출, this() : 생성자 호출을 의미
        System.out.println("생성자 호출됨");
    } //기본생성자 (다른 생성자 생성 시, 기본생성자를 사용하려면 앞에 먼저 만들어줘야함)
    public Book(String t) { // 생성자2
    	this(t, "작가미상"); //생성자3호출
    }
    public Book(String title, String author) { // 생성자3
    	this.title = title; //this : 객체를 의미
        this.author = author;
    }
    
    public static void main(String [] args) {
    	Book javaBook = new Book("Java", "황기태"); // 생성자3 호출
        javaBook.show();
        
        Book bible = new Book("Bible"); // 생성자2 호출
        bible.show();
        
        Book emptyBook = new Book(); // 생성자1 호출
        emptyBook.show();
    }
 }


🔷 메소드

접근지정자 [static] [final] 리턴타입 메소드명(인자들){
		메소드 코드
}
  • 모든 메소드는 반드시 클래스 안에 있어야 함(캡슐화 원칙)

🔹 접근 지정자

: public, private, protected, default

  • public : 모든 접근 허용
  • protected : 동일 패키지와 상속받은 클래스 내에서만 허용
    • class B entends A {} : A의 상속을 받은 B클래스는 다른 패키지에 있어도 A의 멤버 변수/메소드 에 접근 가능
  • default : 동일 패키지 내에서만 허용
    • default 작성하는 것이 아니라, 접근제한자를 생략한 경우를 의미
  • private : 동일 클래스 내에서만 서용
    접근 지정자동일 클래스동일 패키지다른 패키지의 자식 클래스다른 패키지
    publicoooo
    protectedooox
    defaultooxx
    privateoxxx

접근 지정자 사용

  • 클래스 : public, default
  • 생성자, 멤버변수, 멤버메소드 : public, protected, private, default
  • 지역변수 : 접근 지정자 사용 불가

🔹 static 멤버

  • static멤버와 non-static멤버의 차이
    non-static 멤버static 멤버
    객체마다 별도 존재클래스당 하나 생성 (객체 내부가 아닌 별도의 공간에 생성)
    인스턴스 멤버클래스 멤버
    객체 생성 시 멤버 생성클래스 로딩 시 멤버 생성
    객체 생성 후 멤버 사용 가능객체 생기기 전에도 사용 가능
    객체 사라지면 멤버도 사라짐프로그램이 종료될 때 사라짐
    객체 내에 각각 공간 유지(공유x)동일한 클래스의 모든 객체들에 의해 공유
  • 사용 : 클래스명.static멤버 또는 객체명.static멤버
  • 활용 : 전역변수와 전역함수를 만들 때, 공유 멤버 만들고자 할 때 활용
  • static 메소드는 오직 static멤버만 접근 가능 (non-static메소드는 static멤버 사용 가능)
  • static 메소드는 this 사용불가

RAM공간에 대한 참고 자료

  • 객체 생성 시 레퍼런스 변수는 Stack공간에 생성되고 Heap공간을 가리킴 (non-static멤버들은 객체 생성 시 변수가 가리키고 있는 Heap공간안에 생성)
  • static멤버들은 Shared Data 공간에 생성

🔹 final

  • final 클래스 : 더 이상 클래스 상속 불가능
  • final 메소드 : 더 이상 오버라이딩 불가능
  • final 필드 : 상수 선언 시 사용 (선언 시에 초기값 지정, 실행 중 값 변경 불가능)

🔹 인자 전달

  • 기본 타입의 값 전달 : 호출자가 건네는 값이 매개 변수에 복사되어 전달 (실인자 값은 변경x)
  • 객체 레퍼런스 전달 : 매개변수가 실인자 객체 공유(배열도 객체의 한 종류)
    // 예시 : 인자 전달
    public class 클래스명 {
    		static void increase(int m) {
    				m = m+1;
    		}
    		static void increase(Circle m) {
    				m.radius++;
    		}
    		public static void main(String args[]) {
    				int n = 10; //기본타입
    				increase(n); //n값이 매개변수에 복사되어 전달
    				System.out.println(n); //10 (실인자 값은 변경x)
    
    				Circle pizza = new Circle(10); //객체
    				increase(pizza); //객체 레퍼런스 전달
    				System.out.println(pizza.radius); //11
    		}
    }

🔹 오버로딩(Overloading)

: 한 클래스 내에서 둘 이상의 이름이 같은 메소드 작성
  • 메소드 이름 동일해야 함
  • 매개변수 개수가 서로 다르거나, 타입이 서로 달라야 함
  • 리턴타입은 상관 없음
    public class MethodSample {
    		public int getSum(int i, int j){ return i + j; }
    		public int getSum(int i, int j, int k) { return i + j + k; }
    		public double getSum(double i, double j) { return i + j; }
    		public double getSum(int i, int j) { return (double)(i + j); } //첫번째 메소드와 매개변수 개수와 타입이 같으므로 실패
    }


🔷 객체 치환

  • a,b 레퍼런스에 객체를 생성 후, a = b; 로 b를 a에 치환하면, a와 b 레퍼런스는 b의 객체을 가리키게 되고, a의 객체는 가비지가 됨
  • 객체 소멸 : new에 의해 할당 받은 객체와 배열 메모리를 자바 가상 기계로 되돌려 주는 행위
    • 자바 가상 기계의 고유한 역할 (사용자 임의로 객체 소멸x)
  • 가비지 : 가리키는 레퍼런스가 하나도 없는 객체 (더 이상 접근할 수 없어 사용할 수 없게 된 메모리)
    • 자바 가상 기계의 가비지 컬렉터가 자동으로 가비지 수집,반환
Person a, b;
a = new Person("이몽룡");
b = new Person("성춘향");
b = a; //객체 치환(b가 가리키던 객체는 가비지가 됨)
profile
개발, 분석 배운 내용 정리하기!

0개의 댓글