컴공댕이 공부일지

[ OOP 개념 익히기 예제 ] 클래스의 객체 생성 / 생성자 오버로딩 / this 래퍼런스 본문

학교/객지프 정리

[ OOP 개념 익히기 예제 ] 클래스의 객체 생성 / 생성자 오버로딩 / this 래퍼런스

은솜솜솜 2023. 4. 18. 22:48
728x90

 

낯선 객체지향 프로그래밍 용어들.. 개념은 공부했는데 클래스가 뭔지 객체가 뭔지..

잘 와닿지 않는다면? 실습으로 익혀보자!

 

아래의 간단한 예제들 좀 풀다보면

막연하고 추상적이었던 클래스, 객체, 생성자 등등의 개념들을 이해하기가 쉽다.

 

4-1 : 클래스의 객체 생성 및 활용 - 기초

 

Circle.java

public class Circle {

	//필드 : 객체 내의 값을 저장하는 멤버 변수
	int r; //반지름 필드
	String name; //이름 필드
	
	public Circle() {}
	
	public double getArea() {
		return 3.14*r*r;
	}

}

 

Main.java

public class Main {
	public static void main(String[] args) {
		Circle c1; //래퍼런스 변수 선언
		c1 = new Circle(); //객체 생성(new)
		
		c1.r = 5; //.으로 객체의 멤버 접근
		c1.name="동그라미1";
		double a = c1.getArea();
		
		System.out.println("c1의 이름은 : "+c1.name);
		System.out.println("c1의 반지름은 : "+c1.r);
		System.out.println("c1의 면적은 : "+a);
		
		Circle c2 = new Circle();
		c2.r=3;
		System.out.println("c2의 이름은 : "+c2.name);
		System.out.println("c2면적 : "+c2.getArea());
		
	}
	
	
}

>>> 

c1의 이름은 : 동그라미1
c1의 반지름은 : 5
c1의 면적은 : 78.5
c2의 이름은 : null
c2면적 : 28.259999999999998

 

 

 

 

4-2 : 클래스의 객체 생성 및 활용 - 변수값 입력받기

 

Ractangle.java

public class Ractangle {
	
	int w;
	int h;
	
	public int getArea() {
		return w*h;
	}

}

 

Main.java

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		
		Ractangle r1 = new Ractangle();
		
		System.out.println("직사각형 높이:");
		r1.h=s.nextInt();
		System.out.println("직사각형 너비:");
		r1.w=s.nextInt();
		System.out.println("r1의 면적은 "+r1.getArea());
		
	}
	
	
}

>>>

직사각형 높이:
3
직사각형 너비:
4
r1면적 : 12

 

 

 

 

생성자

객체 생성 시에 초기화를 위해 반드시 실행되는 메소드

 

즉, 일일이 값을 대입하는 노동적인 코드 없이,

객체의 생성과 동시에 값을 채워넣을 수 있도록 고안된 것이다!

편리하다 :)

  • 리턴 타입이 없다.
  • new를 통해 객체를 생성할 때 한번 반드시 호출된다.
    (그래서 클래스 내에 하나 이상 선언되어야 한다. 생성자가 하나도 없다면, 컴파일러가 자동으로 기본 생성자 삽입함)
  • 생성자 이름은 반드시 클래스명과 같아야한다.
  • 생성자는 필요에 따라 여러 개 작성 가능 (생성자 오버로딩)

 

기본 생성자 (디폴트 생성자)

매개변수 없고, 아무 작업도 없이 단순 리턴하는 생성자. ex) public Circle() {} 

클래스에 생성자가 하나도 없으면 디폴트 생성자가 자동 삽입된다.

(자동 삽입 되지만 그래도 그냥 기본 생성자는 습관적으로 써두자!)

 

 

 

 

4-3 : 두 개의 생성자를 가진 클래스 - 생성자 오버로딩

메소드 오버로딩 기법으로 Circle 클래스의 생성자를 2가지 만들어보았다.

두 생성자 중 어떤 것을 활용하든, 객체 생성 시에 생성자가 실행된 것을 출력 결과로 알 수 있다.

 

c1은 반지름 지정해준 적 없으나, 기본 생성자에 의해 r=3이됨.

c2도 생성자에 의해 반지름과 이름이 지정됨.

 

Circle.java

public class Circle {

	int r;
	String name;
	
	public Circle() { //매개변수 없는 생성자
		r=3;
	}
	
	public Circle(int num, String str) { //매개변수 있는 생성자 (메소드 오버로딩)
		r=num;
		name=str;
	}
	
	public double getArea() {
		return 3.14*r*r;
	}

}

 

Main.java

public class Main {
	public static void main(String[] args) {
		
		Circle c1 = new Circle(); //기본생성자
		
		//기본생성자의 실행 결과로 반지름이 3으로 설정됨
		System.out.println("c1의 이름은 : "+c1.name);
		System.out.println("c1의 반지름은 : "+c1.r); 
		System.out.println("c1의 면적은 : "+c1.getArea());
		
		
		Circle c2 = new Circle(4,"두번째 똥그라미"); //매개변수 있는 생성자
        //new 키워드로 객체 생성 시에 정수와 스트링값을 전달해야하만 한다. 
        
		System.out.println("c2의 이름은 : "+c2.name);
		System.out.println("c2의 반지름은 : "+c2.r);
		System.out.println("c2의 면적은 : "+c2.getArea());
		
	}
}

>>>

c1의 이름은 : null
c1의 반지름은 : 3
c1의 면적은 : 28.259999999999998
c2의 이름은 : 두번째 똥그라미
c2의 반지름은 : 4
c2의 면적은 : 50.24

 

 

 

4-4 : 생성자 선언 및 활용 연습

책의 저자와 서명을 저장하는 필드를 가진 Book 클래스, 생성자 오버로딩

 

Book.java

public class Book {

	String title;
	String author;
	
	public Book() {} //기본생성자
	
	
	//생성자 오버로딩
	public Book(String t) { //생성자
		title = t;
		author = "작자미상";
	}
	
	public Book(String a, String t) { //생성자
		author = a;
		title = t;
	}
}

 

Main.java

public class Main {
	public static void main(String[] args) {
		
		Book b1 = new Book("생택쥐페리","어린왕자");
		
		System.out.println("b1의 제목,저자 : "+b1.title+"-"+b1.author);

		
		
		Book b2 = new Book("춘향전");
		
		System.out.println("b2의 제목,저자 : "+b2.title+"-"+b2.author);
		
		
	}
	
	
}

>>>

b1의 제목,저자 : 어린왕자-생택쥐페리
b2의 제목,저자 : 춘향전-작자미상

 

 

this 래퍼런스

객체 자기 자신에 대한 래퍼런스 , this는 인스턴스 자기 자신을 가르키는 키워드이다.

this를 활용해 클래스 메소드 및 생성자에서 자기 자신의 데이터를 업데이트하거나 조작할 수 있다.

  • "this.멤버" 형태로 멤버 사용
  • 컴파일러에 의한 자동 관리< 필요성 >
  • 객체 내부에서 인스턴스 멤버임을 명확히 한다.
  • 매개변수와 필드(멤버 변수) 이름이 같을 때 구분이 명확하다.
  • 다른 메소드 호출 시 객체 자신의 래퍼런스를 전달하거나 반환할 때 유용하다.

this 키워드는 아직 왜 쓰는지 잘 감이 안올 수 있는데.. 개발을 하다보면 편리한 기능이라는 게 와닿는다고 한다.

 

 

728x90
Comments