class

치로·2024년 7월 17일

클래스

1. 객체(Object) 지향 프로그래밍

: 객체가 중심이 되는 프로그래밍 기법

2. 클래스(Class)

: 객체의 설계도 역할을 하는 프로그램 소스

  • 공장에서 하나의 설계도를 사용하여 여러 개의 제품을 생산할 수 있는 것처럼 하나의 클래스를 통해 동일한 구조를 갖는 객체를 여러개 생성할 수 있음

3. 객체를 구성하는 단위

  • 객체를 이루는 것을 데이터와 기능
    -> 데이터는 변수로 표현
    -> 객체 안에 포함된 변수를 '필드', '멤버 변수', '프로퍼티'라고 함
  • 기능은 메서드(=함수로 표현

4. 클래스의 기본 작성 방법

class 클래스 이름 {
	멤버 변수;

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

5. 객체의 생성 방법

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

6. 객체의 사용

  • 객체 안에 포함된 변수나 메서드는 .으로 연결하여 접근
    -> 객체 안에 멤버 변수 접근
객체이름.멤버변수;
std1.name;
std1.age;
std2.name;

String username = 객체이름. 멤버변수;
		std1.name;

-> 객체 안에 포함된 변수의 값에 따른 값을 대입하는 경우

객체이름.멤버변수 = 값;
std1.name = "김자바";

-> 객체 안에 포함된 메서드 호출
객체이름.메서드이름();

-> 객체 안에 포함된 메서드에 파라미터 전달
객체이름.메서드이름(값1, 값2, ...);

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

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

8. 메서드를 포함하는 클래스

  • 메서드란 프로그램에서의 하나의 동작 단위를 의미
  • 두 개 이상의 메서드가 서로 동일한 대상을 위해서 존재할 경우, 이 메서드들은 클래스에 포함시켜 그룹화할 수 있음
  • 클래스에 멤버 변수와 메서드가 공존할 경우, 멤버 변수는 모든 메서드가 공유하는 전역 변수로 존재

9. 변수의 종류

  • 멤버 변수(= 전역 변수)
    : 클래스 안에서 선연된 변수로서, 클래스 블록 범위 안에서 유효
  • 지역 변수
    : 메서드 안에서 선언된 변수로서, 메서드의 블록을 빠져나가지 못함, 그러므로 다른 메서드는 해당 변수를 인식하지 못함
    이 규칙은 조건, 반복문과 같은 블록 {}을 형성하는 모든 경우에 해당

10. 메서드만을 포함하는 클래스

  • 객체 안에 멤버 변수(=데이터)가 포함되지 않음
  • 객체 안에 포함된 메서드를 호출하여 결과를 만들기 위한 목적이므로 굳이 여러 개의 객체를 생성할 필요가 없음

11. 클래스, 메서드, 상수의 이름 규칙

  1. 공통 이름 규칙
  • 영어 + 숫자 + _의 조합이고, 첫 글자는 반드시 영어로 표기
  1. 클래스 이름 규칙
    ( _는 잘 안 넣음)
  • 첫 글자는 대문자로 시작, 나머지 그랒는 소문자로 표시
  • 두 개 이상의 단어를 조합해야 할 경우 새로운 단어는 대문자로 시작
    class MyClass
    class Student
    class NetworkHelper
  1. 메서드, 변수 이름 규칙
  • 대부분 소문자로 구성, 2개 이상의 단어를 조합할 경우 새로운 단어는 대문자로 표시
    int age;
    String userName; (String도 class)
  1. 상수 이름 규칙
  • 모두 대문자로 표시
    final double PI;
    final int COLOR;

12. 생성자

!! 중요 !!
1. 생성자란?

  • new 키워드를 사용하여 객체가 생성될 때 자동으로 실행되는 특수한 형태의 메서드
  • 리턴형을 명시하지 않으며, 메서드의 이름은 클래스와 동일
Memeber m = new Member();
class Member {
	Member() {

	} 
}
  • 자동으로 실행된다는 특성 때문에, 객체가 생성되면서 해당 객체의 특성을 초기화하기 위해 사용
    (ex. 멤버 변수의 초기값을 할당하는 용도)
  1. 기본 생성자
  • 파라미터가 없는 생성자
  • 클래스에 특별히 생성자가 정의되지 않은경우, java 컴파일러는 다음과 같은 기본 생성자가 존재한다고 인식
    class User {
    User() {
    // 생성자는 있지만, 내용은 비어있음
    }
    }
  1. 생성자의 활용
  • 생성자는 멤버 변수의 값을 초기화하기 위해 사용
  1. 파라미터를 갖는 생성자
  • 생성자도 메서드의 한 종류이므로 파라미터를 정의하는 것이 가능
  • 생성자의 파라미터를 멤버 변수에 복사하는 것으로 객체의 초기화를 외부적인 요인에 의해 처리할 수 있음

13. null

  • 참조 변수가 어떤 객체도 가리키지 않음을 나타냄

연습 코드

package classobject;

class Student {
	// 멤버 변수 선언 + 할당
	String name = "자바학생";
	int age = 19;
}

public class Main01 {

	public static void main(String[] args) {
		// 객체의 선언과 할당 분리
		Student std1;
		std1 = new Student();
		
		// 객체의 생성 일괄 지정
		Student std2 = new Student();
		
		System.out.println("std1 이름 : " + std1.name);
		System.out.println("std1 나이 : " + std1.age);
		
		System.out.println("std2 이름 : " + std2.name);
		System.out.println("std2 나이 : " + std2.age);
		
		// std1 객체의 name과 age 멤버 변수를 임의의 값으로 변경
		// std1 name과 age, std2 name과 age를 각각 출력
		std1.name = "한서진";
		std1.age = 23;
		
		System.out.println("std1 이름 : " + std1.name);
		System.out.println("std1 나이 : " + std1.age);
		
		System.out.println("std2 이름 : " + std2.name);
		System.out.println("std2 나이 : " + std2.age);
	}

}
package classobject;

class Character {
	String name;
	String job;
	int age;
}

public class Main02 {

	public static void main(String[] args) {
		Character char1 = new Character();
		char1.name = "둘리";
		char1.job = "공룡";
		char1.age = 150;
		
		Character char2 = new Character();
		char2.name = "희동이";
		char2.job = "아기";
		char2.age = 3;
		
		System.out.println("char1 이름 : " + char1.name + ", 직업 : " + char1.job + ", 나이 : " + char1.age);
		System.out.println("char2 이름 : " + char2.name + ", 직업 : " + char2.job + ", 나이 : " + char2.age);
		
	}

}
package classobject;

class HelloWorld {
	String message;
	
	void sayHello() {
		System.out.println(message);
	}
	void setEng() {
		message = "Hello Java";
	}
	void setKor() {
		message = "안녕하세요. 자바";
	}
}

public class Main03 {

	public static void main(String[] args) {
		HelloWorld hello = new HelloWorld();
		hello.setEng();
		hello.sayHello();
		hello.sayHello();
		
		hello.setKor();
		hello.sayHello();
	}

}
package classobject;

class Calc {
	int plus(int x, int y) {
		return x + y;
	}
}
public class Main04 {

	
	public static void main(String[] args) {
		Calc calc1 = new Calc();
		int result = calc1.plus(100, 50);
		System.out.println("100 +50=" + result);
		
//		Calc calc2 = new Calc();
//		System.out.println(calc2.plus(100, 200));
		
		System.out.println(calc1.plus(100, 200));
	}

}
package classobject;

class Calculator {
	int plus(int x, int y) { return x + y;
	}
	int minus(int x, int y) { return x - y;
	}
	int times(int x, int y) { return x * y;
	}
	int divide(int x, int y) { 
		int result = 0;
		if ( y !=0 ) {
			result = x / y;
		}
		return result;	
	}
	
}

public class Main05 {

	public static void main(String[] args) {
		Calculator c = new Calculator();
		int result = c.plus(100, 50);
		
		System.out.println("100 + 50 = " + result);
		System.out.println("100 - 50 = " + c.minus(100, 50));
		System.out.println("100 * 50 = " + c.times(100, 50));
		System.out.println("100 / 50 = " + c.divide(100, 50));
		
	}

}
package classobject;

class Member {
	String name;
	int age;
	
	String getName() {
		return this.name;
	}
	void setName (String name) {
		this.name = name;
	}
	int getAge() {
		return this.age;
	}
	void setAge(int age) {
		this.age = age;
	}
	void say() {
		System.out.println(this.getName());
		System.out.println(this.getAge());
	}
}

public class Main06 {

	public static void main(String[] args) {
		Member m = new Member();
		m.setName("자바학생");
		m.setAge(20);
		m.say();
	
	}

}
package classobject;

class Book {
	String subject;
	String content;
	
	// 생성자 : 객체가 생성될 때, 자동으로 실행되는 특수한 메서드
	// 특징 : 리턴형을 명시하지 않고, 클래스와 이름이 동일
	Book() {
		System.out.println("---생성자 실햄됨---");
		this.subject = "JAVA 입문";
		this.content = "JAVA는 객체 지향 언어이다";
	}
	
	void read() {
		System.out.println("---read() 실행됨---");
		System.out.println(this.subject);
		System.out.println(this.content);
	}
}

public class Main01 {

	public static void main(String[] args) {
		// Book 클래스의 생성자에서 멤버 변수에 대한 기본값을 설정하기 때문에,
		// 객체를 생성하는 것만으로 멤버 변수가 초기화
		Book book = new Book();
		book.read();
	}

}
package classobject;

class User {
	String name;
	int age;
	
	User(String name, int age) {
		// 생성자 파라미터의 값을 멤버 변수에 할당
		this.name = name;
		this.age = age;
	}
}

public class Main02 {

	public static void main(String[] args) {
		// 생성자에 파라미터가 정의된 경우 객체 생성 구문에서 해당 파라미터를 전달해야 함.
		//객체를 생성하면서 설한 파라미터는 생성자를 통해 멤버 변수에 저장
		User user = new User("자바학생", 25);
	
	}

}
package classobject;

class Article {
	int seq; // 글 번호
	String subject; // 글 제목
	String writer; //작성자
	
	// 1. 생성자 생성, seq, subject, writer 멤버 변수의 값에 값을 할당하는 파라미터를 가진 생성자를 만들 것,
	Article (int seq, String subject, String writer) {
		this.seq = seq;
		this.subject = subject;
		this.writer = writer;
	}
	// 2. print(), void, seq, subiect, writer를 각각 출력
	void print() {
		System.out.println(this.seq);
		System.out.println(this.subject);
		System.out.println(this.writer);
	}
}

public class Main03 {

	public static void main(String[] args) {
		// 3. Article class로 객체 생성
		Article article1 = new Article(1, "자바 주제1", "자바학생");
		// 4. print() 호출
		article1.print();
		
		System.out.println("----------");		
		// 5. Article class로 객체2 생성
		Article article2 = new Article(2, "자바 주제2", "홍길동");
		// 6. 객체2.print()
		article2.print();
	}

}

0개의 댓글