TOP
class="layout-aside-left paging-number">
본문 바로가기
프로그래밍 및 기타/Java

[Java] 1월 10일 자바 기초 - 클래스, 인스턴스

by 기록자_Recordian 2025. 1. 10.
728x90
반응형
이전 내용
 

[Java] 25년 1월 9일 자바 기초 - 배열

이전 내용 [Java] 자바 기초 - 문자열이전 내용 [JAVA] 25년 1월 7일 - 자바 기초이전 내용 [JAVA] 25년 1월 3일 - 자바 기초이전 내용 [JAVA] 25년 1월 2일 - 자바 기초◆ 새 프로젝트 만들기 New - java project

puppy-foot-it.tistory.com


클래스 class

 

예를 들어 java의 아래와 같은 코드가 있고,

package java_ex08;

public class Ex_01 {
	// 멤버변수 생성
	String name;
	int age;
	String addr;
	
	// 생성자
	public Ex_01(String name, int age, String addr) {
		this.name = name;
		this.age = age;
		this.addr = addr;
	}
    // 멤버 메서드 생성 (메서드: 함수)
	public void show() {
		System.out.println("이름:"+this.name);
		System.out.println("나이:"+this.age);
		System.out.println("주소:"+this.addr);
	}

	public static void main(String[] args) {
		// 인스턴스 생성
		Ex_01 ex = new Ex_01("홍길동", 30, "인천");
		ex.show();
		System.out.println();
		Ex_01 ex1 = new Ex_01("유재석", 53, "서울");
		ex1.show();
	}
}

해당 코드를 실행하면 아래와 같은 결과가 나온다.

 

이러한 코드의 개념 및 구조를 시각화하면 아래와 같다.

 

[클래스]

- 클래스는 프로그램에서 사용될 객체의 틀을 정의하며, 객체를 생성하기 위한 설계도 역할을 한다.

- 클래스는 여러 가지 멤버 변수와 메서드를 포함하며, 이들을 적절히 구성하여 객체의 동작을 정의한다.

- 클래스는 항상 패키지(package) 안에 만들어져야 한다.

- 클래스의 이름과 인스턴스 이름을 동일하게 할 수는 있으나, 후에 혼동을 줄 수 있으므로 클래스의 이름 첫글자는 대문자, 인스턴스의 이름은 소문자로 짓는 것이 좋다.

- 클래스에는 메인 함수가 포함될 수도 있고, 포함되지 않을 수도 있다. 그러나, 메인 함수와 분리하여 만드는 것이 좋다.

 

★ 클래스의 구성 요소

  • 멤버변수(인스턴스 변수): 클래스 내에서 사용되는 변수이며, 클래스의 속성을 나타낸다.
  • 메서드(인스턴스 메서드): 클래스 내에서 사용되는 함수이며, 클래스의 동작을 나타낸다.
  • 생성자: 클래스로부터 객체를 생성할 때 호출되는 특별한 메서드이며, 객체의 초기화를 수행한다.

 

[코드 설명]

  • public class Ex_01: 클래스. public 은 접근가능자이며, 외부에서 접근 가능하다는 의미이다.
  • 멤버변수: 클래스 내에 선언된 변수이며, 외부에서 접근 가능한 변수. 멤버변수는 필요한 만큼 생성할 수 있다. 이 경우 name, age, addr라는 세 가지 멤버 변수가 선언되어 있다. 멤버 변수는 인스턴스 변수로, 각 객체마다 개별적인 값을 가질 수 있다.
  • public Ex_01: 생성자. 생성자는 클래스의 인스턴스 (멤버변수)를 초기화하는 기능으로, 클래스명과 메서드명이 같다. 이 경우 Ex_01 클래스의 생성자는 String name, int age, String addr라는 세 가지 매개변수를 받는다. 생성자 내부에서 this 키워드를 사용하여 멤버 변수에 초기값을 할당한다.
  • public void show(): show()라는 메서드를 선언한다. void는 리턴 값이 없음을 의미하고, 이 메서드는 매개변수가 없다. 또한 이 메서드는  public 접근 제어자로, 어디서나 호출할 수 있다. 메서드는 System.out.println를 사용하여 콘솔에 멤버 변수의 값을 출력한다. this 키워드를 사용하여 현재 객체의 멤버 변수에 접근한다. 
  • public static void main(String[] args): ain()이라는 메인 메서드를 선언한다. 메인 메서드는 프로그램의 시작점이다.
  • Ex_01 ex = new Ex_01("홍길동", 30, "인천");: Ex_01 클래스의 인스턴스를 생성하여 ex라는 변수에 할당한다. 데이터의 개수는 매개변수 개수와 동일해야 한다.
  • ex.show(); : x.show()를 호출하여 각 인스턴스의 멤버 변수의 값을 출력한다.

[메서드]

- 메서드는 클래스 내에 구현된 함수를 말한다.

- 메서드(함수)의 특징 중 하나는 반드시 호출해야 실행된다는 점이다.


인스턴스 instance

 

클래스에 의해서 만들어진 객체이며,
클래스에서 생성된 각각의 인스턴스는 고유한 상태와 행동을 가지며 객체의 특징을 표현한다.

 

[클래스, 객체, 인스턴스의 차이점]

  • 클래스: 객체를 만들기 위한 설계도 또는 틀. 객체를 생성하기 위한 속성과 메서드 정의.
  • 객체: 속성과 동작을 가지는 실체. 객체는 클래스의 인스턴스이며, 자신만의 상태와 행동을 가짐.
  • 인스턴스: 클래스를 기반으로 생성된 객체. 클래스에서 생성된 각각의 인스턴스는 고유한 상태와 행동을 가지며, 객체의 특징 표현.

예시1

 

아래와 같은 형식으로 클래스, 생성자, 인스턴스, 메서드를 작성할 수도 있다.

public class Person {
// 멤버변수
String name;
int age;
String hp;
String gender;
	
// 생성자 (클래스명과 동일)
// public: 외부에서 접근 가능
public Person(String name, int age, String hp, String gender) {
	this.name = name;
	this.age = age;
	this.hp = hp;
	this.gender = gender;
}
	
// 멤버메서드
public String showInfo() {
	return name + "님의 나이는 " + age + "세이고, 성별은 " + gender + "입니다.";  
}
		
// 메인 함수
public static void main(String[] args) {
	// Person 클래스를 사용하여 여러 개의 인스턴스 생성
	Person hong = new Person("홍길동", 35, "010-1234-5678", "남자");		
	Person kim = new Person("김철수", 28, "010-0987-4321", "남자");	
	Person lee = new Person("이영희", 15, "010-9999-5678", "여자");
	
	// 콘솔에 출력
	System.out.println(hong.showInfo());
	System.out.println(kim.showInfo());
	System.out.println(lee.showInfo());
}

▶ 멤버변수는 4개이나, 위와 같이 메서드에서 3개만 설정할 수도 있다. (단, 메인 함수에서는 메서드에서 설정한 개수만큼 데이터를 입력해줘야 한다.)

 

만약, 메서드 부분만 아래와 같이 수정하여 실행하면

public String showInfo() {
	return name + "님의 나이는 " + age + "세이고, 성별은 " + gender + "입니다."
			+ "\n전화번호는 " + hp + "입니다.\n";  
}

 

- 멤버메서드에서 return 값이 없을 경우, void가 붙는다.

- return 값의 자료형에 따라 맞는 자료형을 적어주면 되며, 이 경우에는 문자열이므로 String이 붙는다.


예시2

 

실무에서는 클래스를 분리해서 만드는 경우가 많다.

  • 프로젝트명: score
  • 클래스(2개): Sungjuk.java / Main.java - main() 포함 

▶ score 라는 패키지 안에 클래스를 두 가지로 넣어서 코드를 작성해 본다.

 

1. Sungjuk 클래스 생성

package score;

public class Sungjuk {
	// 멤버변수
	String name;
	// 클래스 작업 시에는 초기화를 하지 않아도 된다.
	int kor;
	int eng;
	int mat;
	
	// 생성자(멤버변수 초기화)
	// 멤버변수와 매개변수는 이름이 같지 않아도 된다.
	public Sungjuk(String nm, int kr, int en, int mt) {
		this.name = nm;
		this.kor = kr;
		this.eng = en;
		this.mat = mt;
	}
	
	// 멤버메서드(3개의 과목에 대한 총점, 평균, 결과를 계산하여 출력하는 기능)
	public void show() {
		// show 메서드 안에서만 사용 가능한 지역변수
		int tot = kor + eng + mat;
		double avg = tot / 3.0; // 배열이 아니므로 length 사용 불가
		String avg1 = String.format("%.1f", avg); 
		String res = "";
		// 만약 평균이 60점 이상이면 "통과", 아니면 "탈락" 출력
		if (avg>=60) {
			res="통과";
		} else {
			res = "탈락";
		}
		System.out.println(name + " 학생의 국어점수는 " + kor + "점,"
			+ "영어점수는 " + eng + "점," + "수학점수는 " + mat + "점으로,"
			+ "\n총점은 " + tot + "점," + "평균은 " + avg1 + "점입니다"
			+ "따라서 이번 시험은" + res + "입니다.");
	}
}

해당 코드를 실행하면 콘솔에 아무 값도 뜨지 않는데, 그 이유는 값을 출력할 main 함수가 없기 때문이다.

 

2. Main 클래스에 main 함수 생성

package score;

public class Main {

	public static void main(String[] args) {
		// Sungjuk 클래스 사용
		Sungjuk jang = new Sungjuk("장동민", 56, 40, 80);
		Sungjuk lee = new Sungjuk("이미주", 82, 54, 75);
		Sungjuk song = new Sungjuk("송혜교", 92, 80, 72);
		
		// 출력
		jang.show();
		lee.show();
		song.show();
	}
}

 

위 코드를 실행하면


★ 코드 보완 (배열 넣기)

double avg = tot / 3.0;

부분은 배열이 아니므로 length가 사용 불가한데, 이러한 경우 변수가 늘어나면 그때그때 숫자를 변경해줘야 하므로, 추후 편리함을 위해 length 를 넣고자 한다. 이러한 경우에는 두 클래스를 모두 수정해 줘야 한다.

 

1. Sungjuk 클래스 수정

package score;

public class Sungjuk {
	// 멤버변수 (클래스 작업 시에는 초기화를 하지 않아도 된다.)
	String name;
	// 상단의 변수를 배열로 만들기 위한 작업
	int [] num = new int[3];
	
	// 생성자(멤버변수 초기화)
	// 멤버변수와 매개변수는 이름이 같지 않아도 된다.
	public Sungjuk(String nm, int[] num) {
		this.name = nm;
		this.num = num;
	}
	
	// 멤버메서드(3개의 과목에 대한 총점, 평균, 결과를 계산하여 출력하는 기능)
	public void show() {
		// show 메서드 안에서만 사용 가능한 지역변수
        // 배열을 순회해야 하므로 for 반복문 넣어줌.
		int tot = 0;
		for (int i=0; i<num.length; i++) {
			tot += num[i];
		}
		double avg = (double)tot / num.length;
		String avg1 = String.format("%.1f", avg); 
		String res = "";
		// 만약 평균이 60점 이상이면 "통과", 아니면 "탈락" 출력
		if (avg>=60) {
			res="통과";
		} else {
			res = "탈락";
		}
		// 출력 부분에 배열명[인덱스] 넣어줌.
		System.out.println(name + " 학생의 국어점수는 " + num[0] + "점,"
			+ "영어점수는 " + num[1] + "점," + "수학점수는 " + num[2] + "점으로,"
			+ "\n총점은 " + tot + "점," + "평균은 " + avg1 + "점입니다"
			+ " 따라서 이번 시험은" + res + "입니다.\n");
	}
}

 

2. Main 클래스 수정

package score;

public class Main {

	public static void main(String[] args) {
		// Sungjuk 클래스 사용
		// 배열 생성
		int [] arr1 = {56, 40, 80};
		int [] arr2 = {82, 54, 75};
		int [] arr3 = {92, 80, 72};
		
		// 데이터 대입
		Sungjuk jang = new Sungjuk("장동민", arr1);
		Sungjuk lee = new Sungjuk("이미주", arr2);
		Sungjuk song = new Sungjuk("송혜교", arr3);
		
		// 출력
		jang.show();
		lee.show();
		song.show();
	}
}

상단에 배열을 생성하여 값을 입력하고, 후에 데이터 대입 시에 배열을 넣어주면 된다.

위 코드를 실행하면

 


다음 내용

 

 


[출처]

점프 투 자바

https://mundol-colynn.tistory.com/132

728x90
반응형