JAVA - 클래스

박종휘·2022년 9월 30일
0

JAVA - 국비

목록 보기
11/29
post-thumbnail

1. 클래스

1-1. 객체(Object)

  • 프로그래밍에서의 객체는 프로그램에서 표현하고자 하는 기능을 묶기 위한 단위

1-2. 객체를 구성하는 단위

  • 객체를 이루는 것은 데이터와 기능이다.
  • 데이터는 변수로 표현된다.
  • 객체 안에 포함된 변수를 '멤버변수' 혹은 '프로퍼티'라 한다.
  • 기능은 메서드(=함수)로 표현된다.

1-3. 클래스와 객체의 관계

  • 객체를 생성하기 위해서 객체의 설계도가 필요하다.
  • 객체의 설계도 역할을 하는 프로그램 소스 -> 클래스(Class)
  • 공장에서 하나의 설계도를 사용하여 여러 개의 제품을 생산할 수 있는 것처럼 하나의 클래스를 통해 동일한 구조를 갖는 객체를 여러 개 생성할 수 있다.
  • 자동차의 엔진, 문, 바퀴 등은 멤버변수로 존재할 수 있다.
  • 전진, 후진 등은 메서드의 형태로 표현된다.

1-4. 자동차 클래스의 예

  • 동일한 설계로 만들어진 자동차라 하더라도 각각의 자동차를 구성하는 부품들은 그 형태만 같을 뿐, 실제로는 각각 존재하게 된다.
  • 클래스를 작성하면서 그 안에 생성되는 멤버변수들은 여러 개의 객체간에 서로 동일한 이름으로 존재하지만 실제로는 서로 다른 값이라는 의미

1-5. 클래스의 기본 작성 방법

class 클래스이름{
		멤버변수;
        
        void 메서드이름() {
        
        }
}
  • 'class'라는 예약어와 클래스의 이름을 명시하고 {...} 블록을 구성한다.
  • 멤버변수는 여러 개가 존재할 수 있다. 이 때, 값을 선언과 동시에 할당할 수도 있고, 객체를 통해 간접적으로 할당할 수도 있다.
  • 메서드는 여러 개 존재할 수 있다.
  • 클래스 안에 포함된 멤버변수와 메서드를 특성에 따라 그룹화하기 위한 기법이 클래스를 작성하는 것이라고 이해할 수 있다.

1-6. 객체의 생성 방법

  • 객체의 선언

    	클래스이름 객체이름;
  • 객체의 할당

    	객체이름 = new 클래스이름();
  • 선언과 할당의 통합

    	클래스이름 객체이름 = new 클래스이름();

1-7. 객체의 사용

  • 객체 안에 포함된 변수나 메서드는 점(.)으로 연결하여 접근한다.
    • 객체 안에 포함된 변수의 값을 다른 변수에 복사하는 경우

      변수 = 객체이름.멤버변수;
    • 객체 안에 포함된 변수의 값에 다른 값을 대입하는 경우

      객체이름.멤버변수 = 값;
    • 객체 안에 포함된 메서드를 호출하는 경우

      객체이름.메서드이름();
    • 객체 안에 포함된 메서드에 파라미터를 전달하는 경우

      객체이름.메서드이름(값1, 값2, 값3, ..., 갑n);

Main 01

class Student{  // 클래스 이름의 첫 글자는 대문자로 하는 것이 좋다!
	// 이름, 나이
	String name = "자바학생";
	int age = 19;
}

public class Main01 {

	public static void main(String[] args) {
		// 객체의 선언과 할당의 분리
		Student std;  // 클래스이름 객체이름;
		std = new Student();	// 객체이름 = new 클래스이름();
		
		// 객체의 생성(일괄지정)
		Student std2 = new Student();
        // 클래스이름 객체이름 = new 클래스이름();
		
		System.out.println( "std 이름 : " + std.name );
		System.out.println( "std 나이 : " + std.age );
		
		System.out.println( "std2 이름 : " + std2.name );
		System.out.println( "std2 나이 : " + std2.age );
		
		std2.name = "JSP학생";
		std2.age = 18;
		
		System.out.println( "std2 이름 : " + std2.name );
		System.out.println( "std2 나이 : " + std2.age );
	}
}
✔ result

std 이름 : 자바학생
std 나이 : 19
std2 이름 : 자바학생
std2 나이 : 19
std2 이름 : JSP학생
std2 나이 : 18

1-8. 클래스를 정의하면서 멤버변수에 값을 직접 대입하는 경우

  • 앞 예제(Main01.java)는 객체를 생성함과 동시에 객체 안에 name변수와 age변수가 할당된 값을 포함하게 된다.
  • 같은 클래스로 객체를 여러 개 생성할 경우, 모든 객체가 동일한 값을 갖게 된다.
		std		name = "자바학생"
        		age = 19
Student
		std2	name = "자바학생"
        		age = 19
  • 같은 클래스를 통하여 생성된 객체라 할지라도 서로 다른 값을 대입하면 서로 독립적인 형태로 존재하게 된다.

1-9. 값이 대입되지 않은 멤버변수를 갖는 클래스

  • 클래스란 객체를 위한 틀을 제공하는 것이기 때문에 클래스 작성 과정에서 멤버변수에 대입된 값은, 객체를 통하여 멤버변수의 값을 지정하기 전까지 사용될 "기본값"으로서의 의미이다.
  • 객체를 통하여 새로운 값이 대입되면 클래스 작성시에 멤버변수에 대입한 값은 의미를 잃어버리게 된다.
  • 때문에 일반적으로 클래스 작성 시에는 멤버변수에 값을 지정하지 않는다.

Main 02

class Character{
	// 일반적으로 멤버변수는 선언만 한다.
	String name;
	int age;
}

public class Main02 {

	public static void main(String[] args) {
		// 하나의 클래스가 정의되면, 그 클래스의 구조를 기반으로하는
		// 객체(=Object)를 여러개 생성할 수 있다.
		
		Character d = new Character();
		d.name = "둘리";
		d.age = 20;
		
		Character h = new Character();
		h.name = "희동";
		h.age = 3;
		
		System.out.println("이름 : " + d.name + " , 나이 : " + d.age);
		System.out.println("이름 : " + h.name + " , 나이 : " + h.age);
	}
}
✔ result

이름 : 둘리 , 나이 : 20
이름 : 희동 , 나이 : 3

1-10 메서드를 포함하는 클래스

  • 메서드란 프로그램에서 하나의 동작 단위를 의미한다.

  • 두 개 이상의 메서드가 서로 동일한 대상을 위해서 존재할 경우, 이 메서드들을 클래스에 포함시켜 그룹화 할 수 있다.

  • 클래스에 멤버변수와 메서드가 공존할 경우, 멤버변수는 모든 메서드가 공유하는 전역 변수로 존재하게 된다.

  • 변수의 종류
    -> 멤버변수(전역변수)
    : 클래스 안에서 선언된 변수로서, 클래스 블록 범위 안에서 유효하다.


    -> 지역변수
    : 메서드 안에서 선언된 변수로서, 메서드의 블록을 빠져나가지 못한다. 그러므로 다른 메서드는 해당 변수를 인식하지 못한다. 이 규칙은 조건, 반복문과 같은 블록 {}을 형성하는 모든 경우에 해당한다.


🎇 참고

  • 지역변수와 전역변수가 선언되는 메모리 영역이 다르다.
  • 전역변수(멤버번수)는 Heap 영역에 저장
  • 지역변수는 Stack영역에 저장 -> 자동으로 초기화되지 않는다.
  • heap : 프로그래머가 원하는 방식으로 쓸 수 있는 공간, 긴 생명주기를 가진 데이터들을 저장
  • stack : 아주 잠깐 사용하고 삭제할 데이터의 저장공간

Main 03

class HelloWorld{
	// 멤버변수(전역변수)는 모든 메서드가 공유한다.
	String message; 
    int num; // 전역변수
	
	void sayHello() { 	System.out.println( message ); }
	void setEng() 	{	message = "Hello Java";	}
	void setKor() 	{	message = "안녕하세요. 자바"; }
    
    void test(){
    	int num2; // 지역변수
        System.out.println(num2);
    }
}

public class Main03 {
	

	public static void main(String[] args) {
		HelloWorld hello = new HelloWorld();
		
		// 메서드 호출
		hello.sayHello();
		hello.setEng();
		hello.sayHello();
		hello.setKor();
		hello.sayHello();
		hello.setEng();
		hello.setKor();
		hello.setEng();
		hello.setKor();
		hello.sayHello();
	}
}
✔ result

null
Hello Java
안녕하세요. 자바
안녕하세요. 자바

1-11. 메서드만을 포함하는 클래스

  • 객체 안에 멤버변수(=데이터)가 포함되지 않는다.
  • 객체 안에 포함된 메서드를 호출하여 결과를 만들기 위한 목적이므로
    굳이 여러 개의 객체를 생성할 필요가 없다.
-> 계산 기능을 갖는 클래스 예

class Calc {
	int sum(int x, int y) {
    	return x + y;
    }
}

-> 기능의 활용 : 두 개의 값을 위하여 객체를 각각 생성하는 경우

Calc c1 = new Calc();
int a = c1.sum(100, 200);
System.out.println(a);

Calc c2 = new Calc();
int b = c2.sum(200, 300);
System.out.println(b);
  • 파라미터에 의해 결과를 리턴하는 경우, 서로 다른 값을 위하여 객체를 여러 개 생성할 필요가 없다.
  • 자체적으로 데이터를 갖는 형태가 아니라 외부적인 요인인 파라미터에 의해서 결과가 생성되므로, 하나의 객체를 재사용하는 것이 바람직하다.
Calc c1 = new Calc();
int a = c1.sum( 100, 200 );
System.out.println( a );
int b = c1.sum( 200, 300 );
System.out.println( b );
profile
개린이의 개발 고수되기 작전!

0개의 댓글