«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

장미의 개발일기

Java프로그래밍: 클래스 정의하기 , 클래스 만들기 본문

방통대 컴퓨터과학과

Java프로그래밍: 클래스 정의하기 , 클래스 만들기

민장미 2023. 4. 15. 20:29

저번 학기에  개판이래도 C++을 수강하고 보니 클래스에 대한 개념이

어느정도 잡혀있긴 해서 이해하긴 수월했다. 다만 C,C++은 함수 단위위주인 언어고

자바는 클래스 단위라 차이점도 은근 많은 듯?

 

다음주 국비과정에서 드디어 클래스로 진도 나갈 것 같은데 예습 겸 해서 학교 강의 들으면서

교재로 공부했다.

 

클래스의 개념이나 설명에 대한 것은 이 포스팅에서 생략한다.

 

클래스

클래스를 사용하는 이유? => 프로그램을 재사용하기 위한 것. 

객체 => 클래스를 실체화 한 것. 현실에 실제로 만드는 것.  (ex) 클래스= 붕어빵 틀/객체=붕어빵   

이렇게 실체화 된 객체를 인스턴스라고 한다. 

: 객체가 곧 인스턴스고, 참조되지 않은 인스턴스는 쓰레기(gabage)다. 

 

 

- 접근 제어자 (클래스, 필드,메소드, static 필드/메소드 등 전부 해당)

  1생략할 경우: 같은 패키지 내의 다른 클래스들에서 사용가능 / 해당 클래스 내부 안

  2 private : 해당 클래스 내부에서만 사용가능

  3 public : 해당 클래스를 참조 가능한 곳이면 어디든 사용가능

  4 protected :  같은 패키지 내에서, 해당 클래스 안에서, 해당 클래스를 상속받은 서브 클래스에서 사용가능

 

 

클래스 정의하기

*멤버필드는 주로 praivate로 선언하여 외부에서 접근을 하지 못하게 한다.

*대신에 메소드를 public으로 선언하여, 메소드를 통해 멤버필드를 간접적으로 접근할 수 있도록 한다.

=> 캡슐화 ( 감출것은 감춘다) 

 

*생성자:  특별한 메소드

객체 생성시 자동으로 호출되는 메소드. 객체가 사용할 변수나 필드 등을 초기화하거나 객체의 사용을 위해

필요한 초기화 작업을 수행한다. 

 

*형식:  접근제어자   클래스이름{   }

-메소드지만 반환자료형 표기가 불가능하며, 이름은 클래스명과 똑같아야만 한다. 

()안에는 주로 클래스의 메소드의 매개변수에 들어갈 인수가 들어간다. 

-대부분 public 으로 선언된다. 

-생략할 경우 기본 생성자(디폴트생성자)가 자동으로 만들어지는데, 슈퍼 클래스의 기본 생성자를 호출해준다.

 

 

Static 필드와 메소드

각 객체가 소유한 필드와 메소드는 'non-static'으로 각 객체의 필드,메소드 전부 독립적이다. =>필드: 인스턴스 변수 

반면에 Static 필드와 메소드는 단 하나의 유일한 존재로, 모든 객체가 이 필드와 메소드를 공유한다. => 필드:클래스 변수

 

*초기화 

static 필드와 메소드의 선언시에 초기화를 하는 것이 좋다.

(반대로 일반 필드,메소드는 생성자를 통해 초기화하는 것이 좋다) 

(반대로도 가능하지만 비효율적이다)

 - 일반 메소드에서 static 필드를 사용할 수 있지만, static메소드에선 static 필드만 사용할 수 있다는 점에 유의하자. 

 

*final 필드와 final 메소드, final 클래스

상수를 선언하는 식과 비슷하게 생각하면 된다.

final로 선언한 클래스는 서브클래스를 만들 수 없으며, final로 선언한 메소드와 필드 역시 

오버라이딩과 값을 바꿀 수가 없다. 

 

클래스를 이용하여 객체지향적인 프로그램 만들기 

생각보다 교재의 예제가 이해하기 쉽게 되어 있어서 놀랐다.

바로 이클립스로 원 클래스-원 넓이 구하기 프로그램 - 원기둥 클래스-원 기둥 부피 구하기 프로그램 만들기를

연습해보았다. 

 (public 클래스는 한 소스파일에 단 하나만 존재해야하며, public 클래스의 이름은 소스파일과 일치한다는 점을 유의하자)

시작하기에 앞서, 클래스 윗 칸에 간단히 알고리즘식으로 설명을 만들었다.

 

//1. 원을 구성하는 클래스를 만든다.

   // 필드: 반지름 메소드: 넓이를 구한다. 생성자: 반지름의 길이를 지정한다. )동작)

//2. 원 클래스를 이용하여 원의 넓이를 구하는 프로그램을 만든다.

   // 원클래스 객체를 생성한다. -> 원 클래스의 메소드를 이용하여 원 넓이를 구한 후, 출력

//3. 원 클래스를 이용하여 원 기둥 클래스를 만든다.

   // 필드: 원클래스 객체(넓이), 높기둥의 높이 메소드: 원기둥의 부피 구하기 / 생성자: 원의 넓이와 높이를 지정하는 동작

//4. 원 기둥 클래스를 이용하여 원 기둥 부피를 구한다.

   // 원 기둥 클래스의 객체를 생성 => 원기둥 클래스의 메소드로 원 기둥 부피를 구하고 출력.

원 클래스 만들기 및 반지름 구하기 프로그램 

package my;

class Circle{
	private int r; // 필드 반지름 단위는 cm
	public Circle(int a) {//생성자: 반지름 값을 설정한다.
		r = a; 
	}
	public double getArea() {//원의 넓이를 구하는 메소드 
		return r*r*3.1415;
	} // 직접 접근 불가한 필드 r을 간접적으로 접근가능하도록 해준다. 
}
public class MakingClass_Circle2 {
	public static void main(String[] args) {
		Circle c = new Circle(20); 
		//원 클래스의 객체 c 를 생성, 20cm반지름을 가진 원 
		//이때 객체 c의 생성자가 호출된다.
		
		double res = c.getArea();
		//객체 c의 넓이 구하기 메소드를 호출한다. 
		// 그 결과를 double형 변수 res에 저장
		
		System.out.println(res);
		//그 결과값을 출력 
		//변수 res 생성없이 바로 c.getArea()를 넣어도됌
	}//main
}

원기둥 클래스 만들기 및 원기둥 부피 구하기 프로그램 만들기

 

package my;

class cylinder{
	private Circle c; //이미 만들어진 원 c  
	private int height; // 원기둥의 높이  
	public cylinder(Circle d,int a) {
		c = d;
		height = a;
	} //생성자: 두 필드에 값을 설정해준다.
	// d,a는 매개변수
	public double getVolume() {
		return c.getArea()*height;
	//원기둥 부피 구하기 : 밑 원넓이*높이 	
	// c*height 랑 헷갈리지 말자. c는 객체
	// c.getArea는 c라는 원의 넓이가 반환되는 메소드
	}
}

public class MakingClass_Cylinder {
	public static void main(String[] args) {
		Circle c = new Circle(20);
		//여기에서도 원 객체를 생성해줘야 한다 = 메모리할당
		// 반지름은 똑같이 20으로 설정 
		
		cylinder cy = new cylinder(c, 10);
		//원 객체 c를 먼저 생성해줘야 여기에 인자로 넣을 수 있다. 
		
		double res = cy.getVolume();
		// double형 변수 res에 원기둥 값을 저장
		System.out.println(res);		
	}//main
}

 

아직 손에 익숙치 못해서 실수를 좀 하기 하는데... 클래스 개념에 대해서는 터득한 거 같다 !!

 

파이썬 강의 밀린거 들으러 간다 ㅠㅠㅠ