[Java] 클래스

이주형·2023년 5월 9일
0

Java

목록 보기
1/10

📌 클래스

클래스를 알기 전에 절차 지향과 객체 지향 프로그래밍에 대해 알아보자.

절차 지향 프로그래밍은 프로그램이 동작하는 순서대로 프로그래밍하는 기법이다. 그래서 유지 보수가 어렵고 기능별로 구분하기 어렵고 코드의 재사용이 어렵다. 그래서 나온 것이 객체 지향 프로그래밍이다.

OOP(Object Oriented Programming)라고 하는데 프로그램을 작성할 때 먼저 프로그램에서 사용할 기능들을 정리하고 정리한 기능을 가지고 있는 작은 부품들을 만들어서 프로그램에서는 이렇게 만든 부품들을 사용하여 프로그램을 작성하는 기법이다. 작은 부품을 객체라고 부르는데 이것으로 인해 유지보수가 용이하고 코드의 재사용성이 높아지는 장점을 가질 수 있다.

이러한 객체를 만들 수 있는 것을 클래스라고 한다.

📌 팁

클래스를 설계하는 팁이 있다.

  • 필요한 기능이 무엇인지
  • 필요한 기능들을 단위별로 구분할 수 있는지
  • 클래스간에 종속성이 최소한인지
  • 중복되지는 않는지
  • 쉽게 만들었는지
  • 꼭 필요한 기능만을 가지고 있는지
public class MainClass {

	public static void main(String[] args) {

		TestClass1 t1 = new TestClass1();
		t1.testMethod1();

		// 객체 참조 변수를 통한 멤버 변수 접근
		// 메서드와 동일하게 . 을 통해 접근한다.
		System.out.printf("t1.memberA1 : %d\n", t1.memberA1);
		System.out.printf("t1.memberA2 : %d\n", t1.memberA2);
	}

}

class TestClass1 {
	// 멤버 변수
	int memberA1 = 100;
	int memberA2 = 200;

	// 같은 클래스에 정의한 메서드에서 변수를 사용한다.
	public void testMethod1() {
		// 같은 클래스에 정의한 메서드 내에서는 멤버 변수의 접근이 자유롭고
		// 변수의 이름만 작성하면 된다.
		System.out.printf("memberA1 : %d\n", memberA1);
		System.out.printf("memberA2 : %d\n", memberA2);
	}
}

객체를 생성하면 JVM이 객체 ID를 생성하고 변수 t1에 객체 ID가 저장된다.
t1에 .을 찍으면 ID를 통해 객체에 접근한다는 뜻이다.
.을 통해 멤버 변수와 멤버 메서드에 접근할 수 있게 된다.

📌 객체의 소멸 시점

TestClass1 t1 = new TestClass1();

// 객체의 ID값을 가지고 있는 변수가 하나도 없다면 소멸의 대상이 된다.
t1 = null;

// 메모리 청소 시점
// JVM이 메모리가 부족하다고 판단되는 경우
// OS가 메모리가 부족하다고 판단하는 경우
// 프로그램이 종료되면(JVM이 종료되면) OS에 의해 청소된다.
// 개발자가 코드를 통해 명시적으로 메모리 청소 명령을 날릴 경우.

// 가비지 컬렉션 : 쓰래기들을 모아 버린다는 의미를 가지고 있다.
// 프로그래밍 언어에서 더이상 사용하지 않는지만 메모리를 차지하고 있는 것들을
// 모아 제거하는 작업을 의미한다.
// 가비지 컬렉터 : 가비지 컬렉션을 해주는 소프트웨어

// 가비지 컬렉션은 매우 부담되는 작업이기 때문에 너무 많이 발생하지 않는 것이 중요
for (int i = 0; i < 1000; i++) {
	System.out.println(i);
	// 가비지 컬렉터 가동
	System.gc();
}

📌 생성자

Java 클래스에서 객체를 생성할 때 반드시 수행되어야는 코드가 있거나 초기화의 작업을 하는데 사용되어진다.

생성자는 반환 타입이 없고 클래스 이름과 동일하게 작성해준다.

//생성자가 없는 클래스
//클래스를 만들 때 생성자를 작성하지 않으면 기본 생성자가 자동으로 추가된다.
//기본 생성자 : 클래스이름(){ }
class TestClass1 {

}

//매개 변수가 없는 생성자를 가지는 클래스
class TestClass2 {
	// 생성자
	public TestClass2() {
		System.out.println("TestClass2의 생성자");
	}
}

//매개 변수가 있는 생성자를 가지는 클래스
class Student {
	String name;
	int grade;
	int kor;
	int eng;
	int math;

	public Student(String name, int grade, int kor, int eng, int math) {
		// this : 객체의 멤버에 접근할 때 사용한다.
		this.name = name;
		this.grade = grade;
		this.kor = kor;
		this.eng = eng;
		this.math = math;
	}
}

📌 생성자 OverLoading

OverLoading이란 메서드나 생성자를 작성할 때 매개변수의 형태를 다르게 하여 같은 이름으로 여러개를 만들 수 있도록 제공되는 개념이다

class TestClass1 {
	int memberA;
	int memberB;

	// 생성자 Overloading
	// 생성자에서 다른 생성자를 호출할 때는 this()를 사용한다
	// 생성자 내에서 첫 번째 코드여야 한다.
	public TestClass1() {
		this(100, 200);
		// this.memberA = 100;
		// this.memberB = 200;
	}

	public TestClass1(int memberA) {
		this(memberA, 200);
		// this.memberA = memberA;
		// this.memberB = 200;
	}

	public TestClass1(int memberA, int memberB) {
		this.memberA = memberA;
		this.memberB = memberB;
	}

	public void printMember() {
		System.out.printf("memberA : %d\n", memberA);
		System.out.printf("memberB : %d\n", memberB);
	}

	// 메서드도 이름을 동일하게 하고 매개변수의 형태를 다르게 하여
	// 메서드를 여러개 만들 수 있다.
	public int add(int a1, int a2) {
		return a1 + a2;
	}

	public long add(long a1, long a2) {
		return a1 + a2;
	}

	public double add(double a1, double a2) {
		return a1 + a2;
	}

	// 가변형 매개변수.
	// 타입이 같은 매개변수를 가지고 있는 메서드를 무한정 만들수 없기 때문에
	// 제공되는 개념
	// 매개 변수를 작성할 때 ... 을 붙혀주면 전달 되는 값들을 배열로 만들어
	// 사용할 수 있다.
	public int add2(int... a1) {
		int total = 0;

		for (int value : a1) {
			total += value;
		}

		return total;
	}
}

0개의 댓글