자바 선행학습 5일차 (마지막) - class, 생성자, 메소드

728x90

주의할 점: 언어의 늪에 빠지지말고 일단 학습하여 흐름을 눈에 익힌 후에 개념을 이해하자 


클래스의 정의

  • 데이터와 그 데이터를 처리하기 위한 메소드를 가짐
  • VO or DTO라고 불림: Value Object & Data Access Object
  • bean: 자바를 구성하는 최소단위로 처리 데이터를 메모리에 기억하는 멤버변수와 getter & setter로 구성되 있음

클래스의 순서는 대략적으로 이렇다

멤버변수 선언 > 생성자 입력 > getters&setters (데이터 계산 메소드) 입력 > toString 입력 (데이터 출력문)

 

아래의 예시를 보면서 이해할 것

1. 멤버 변수 선언

 - 주어진 데이터는 아무나 접근하여 바꾸면 안되기때문에 private 접근제한자로 접근을 제한한다.

아래는 데이터 초기화를 시키지 않았기 때문에 int: 0, String(class): null, boolean: false로 자동으로 선언된다. 

 - boolean의 변수이름 앞은 is를 붙이는 것이 관례

나중에 index의 값을 올리기위하여 count에 static을 붙여 메모리값을 공유하도록 함

import java.util.Date;

public class test {
//	테스트 인덱스, 테스트이름, 성공여부, 날짜 정의
	private static int count; //index 증가를 위한 count 변수
	private int index;
	private String TestName;
	private boolean isResult;
	private Date date;
}

 

 

2. 메소드(생성자) 선언

시스템은 항상 위에서부터 아래로 실행된다는 것을 잊지 말자.

메소드를 정의하여 testName이라는 지역변수에 값이 입력받았을 때, 멤버변수 TestName에 값이 할당되는 식

 - class값과 지역변수의 이름이 같기때문에 this. 함수를 써서 지역변수에 우선권을 줌 (원래 지역변수가 우선되긴 함)

단축키: Alt + Shift + s > o

 

이 메소드를 통해 입력받을 값은 일단 testName, isResult, TestPrice 그리고 date로 정했다.

날짜는 함수 그 자체로 입력

public class test {
//	테스트 인덱스, 테스트이름, 성공여부, 날짜 정의
	private static int count;
	private int index;
	private String TestName;
	private boolean isResult;
	private Date date;
	
//	메소드 선언
public test(String testName, boolean isResult, int TestPrice, Date date) {
	this.index = index;
	this.TestName = testName;
	this.isResult = isResult;
	this.TestPrice = TestPrice;
	this.date = date;
	}

 

3. getters & setters 선언

데이터를 받았으면 데이터를 꺼내고 쓸 수 있어야지 쓸모가 있는 class.

  • 멤버변수가 private 접근 권한자를 사용했기 때문에 예외적 허용을 주기 위한 목적으로 사용
  • 사용법: test.getTestName() 하여 데이터 추출 test.setTestName() 하여 데이터 삽입

단축키: Alt + Shift + s > r

 > 원하는 변수 select하라고 나오는데 귀찮으니 왠만하면 select all 하자

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class test {
//	테스트 인덱스, 테스트이름, 성공여부, 날짜 정의
	private static int count;
	private int index;
	private String TestName;
	private boolean isResult;
	private int TestPrice;
	private Date date;
	
//	메소드 선언
public test(String testName, boolean isResult, int TestPrice, Date date) {
	this.index = index;
	this.TestName = testName;
	this.isResult = isResult;
	this.TestPrice = TestPrice;
	this.date = date;
	}

// getter setter 선언
public static int getCount() {
	return count;
}
public static void setCount(int count) {
	test.count = count;
}
public int getIndex() {
	return index;
}
public void setIndex(int index) {
	this.index = index;
}
public String getTestName() {
	return TestName;
}
public void setTestName(String testName) {
	TestName = testName;
}
public boolean isResult() {
	return isResult;
}
public void setResult(boolean isResult) {
	this.isResult = isResult;
}
public int getTestPrice() {
	return TestPrice;
}
public void setTestPrice(int testPrice) {
	TestPrice = testPrice;
}
public Date getDate() {
	return date;
}
public void setDate(Date date) {
	this.date = date;
}

 

4. ToString (override)

현재까지 받고 삽입한 데이터를 출력할 때 지정할 출력 서식 개념

 - 이 때 날짜나 숫자에 서식을 변경하고 싶으면 SimpleDateFormat, DecimalFormat등을 이용하여 서식변수 지정 후에 출력하면 지정한대로 출력이된다.

단축키: Alt + Shift + s > s

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class test {
//	테스트 인덱스, 테스트이름, 성공여부, 날짜 정의
	private static int count;
	private int index;
	private String TestName;
	private boolean isResult;
	private int TestPrice;
	private Date date;
	
//	메소드 선언
public test(String testName, boolean isResult, int TestPrice, Date date) {
	this.index = index;
	this.TestName = testName;
	this.isResult = isResult;
	this.TestPrice = TestPrice;
	this.date = date;
	}

// getter setter 선언
public static int getCount() {
	return count;
}
public static void setCount(int count) {
	test.count = count;
}
public int getIndex() {
	return index;
}
public void setIndex(int index) {
	this.index = index;
}
public String getTestName() {
	return TestName;
}
public void setTestName(String testName) {
	TestName = testName;
}
public boolean isResult() {
	return isResult;
}
public void setResult(boolean isResult) {
	this.isResult = isResult;
}
public int getTestPrice() {
	return TestPrice;
}
public void setTestPrice(int testPrice) {
	TestPrice = testPrice;
}
public Date getDate() {
	return date;
}
public void setDate(Date date) {
	this.date = date;
}

//출력문 서식 지정하여 출력
@Override
public String toString() {
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd E요일");
	DecimalFormat df = new DecimalFormat("₩#,##0");
	
	return "test [index=" + index + ", TestName=" + TestName + 
			", 결과=" + isResult + ", 가격=" + df.format(TestPrice) +
            ", 날짜=" + sdf.format(date) + "]";
}

Class 선언하기

위와 같이 다 만들었으면 다른 class file을 하나 만들어서 Scanner를 선언하는 방식과 같이 본인의 class를 선언해보자

예시: test t = new test();

 - class는 대문자로 만드는 것이 맞는데 test라 소문자 실수...

 

test class를 t라는 변수로 선언하여 class 지정값에 맞게 데이터를 입력하고 print를 통해 출력을 하면 아래와 같이 나옴

중간에 set을(getter & setter)을 활욯하여 TestName에 "테스트2"라는 값을 삽입하면 값이 변경됨

 - 서식과 가격은 class 파일에서 내가 지정한대로 출력

import java.util.Date;
import java.util.Scanner;

public class test2 {
	public static void main(String[] args) {
		Date date = new Date();
		test t = new test("테스트", true, 99999, date);		
		System.out.println(t);
		t.setTestName("테스트2");
		System.out.println(t.getTestName());
	}
}
//출력문 결과:
//test [index=0, TestName=테스트, 결과=true, 가격=₩99,999, 날짜=2022.01.22 토요일]
//테스트2

수업 class 노트

아래는 수업때 정리해논 것. 위에 보기쉽게 풀어놓았다

혹시 모를 참조용

import java.text.SimpleDateFormat;
import java.util.Date;

// 클래스는 데이터와 그 데이터를 처리하기 위한 메소드를 가진다
// VO (Value Object): 처리할 데이터 한 건을 기억하는 class, DTO라고도 함
// *DTO(Date Access Object)
// bean: 자바로 작업하는데 필요한 최소단위; 커피를 먹는데 커피콩이 필요한 것에서 유래
//       처리할 데이터를 기억하는 멤버변수와 데이터를 입출력 할 수 있는 getters & setters
//       메소드로만 구성된 class를 말한다.

public class PersonDef {

//	멤버변수(필드) - class내의 변수 - 를 정의한다.
//	자바는 멤버 변수를 선언만 하면 숫자: 0, 문자 공백, boolean false, 클래스 null로 자동선언

//	멤버 변수는 static 멤버 변수와 인스턴스 멤버 변수가 존재
//	static 멤버 변수는 현재 class로 생성되는 모든 객체에서 같은 기억장소를 공유해서 사용함.
	//	 > 예시: 스타에서 탱크를 생산할 때 같인 기억장소에서 최대 HP데이터를 불러와서 생산함
//	static 은 공간을 공유하므로 자주 사용하는 변수나 메소드에 적용해서 . 으로 변수만 불러오자.

	
//	인스턴스 멤버 변수는 현재 class로 생성되는 모든 객체에서 독립된 기억공간을 가진다.
//	 > 예시: 탱크는 같은 최대HP로 생산되지만 각각의 HP공간을 가져야 남의 HP를 공유하지 않기때문에
//	         각각의 인스턴스 변수로 생산해야 개별의 HP를 가질 수 있다.
	
//	변수를 private으로 지정해서 변수생성
//	[접근권한지정자] [static]자료형 변수명 [=초기치]
	
	
	
//	static을 사용해서 index를 1씩 증가시켜주도록 함
	public static int count; //정적 멤버 변수
	
	private int idx; 		//일련번호 = 객체 생성시마다 1씩 증가시킨다
	private String name;	//이름
	private boolean gender;	//성별
	private int age;		//나이
	private Date date;		//가입날짜 = 객체가 생성될 때 컴퓨터의 날짜 시간을 저장한다
	
	
//	====================================생성자의 정리본====================================
//	생성자 메소드(=생성자; Constructor)를 정의한다.
//	생성자 이름은 class 이름과 똑같고 현재 클래스의 객체가 생성되는 순간 자동 실행된다.
//	생성자는 return을 쓰지않고 리턴타입도 사용하지 않는다.
//	 > 생성자의 주 목적: 멤버 변수를 초기화하기 위해 사용. 다만 생성자를 생성하지 않으면
//	                     자바 컴파일러가 알아서 아무 일도 생성하지 않는 기본 생성자를 임의로
//	 					 생성한다. 하지만 프로그래머가 별도의 생성자를 정의하지 않으면 생성자는
//	                     자동으로 만들어지지 않는다.

//	생성자 생성 - 새로운 class를 생성할때 무조건 처음으로 만들어야 할 것
//	생성자 = class 이름 & return, return type도 적지 않는다
//	======================================================================================
	
	
	
	
//	public Person() {
//		System.out.println("기본 생성자가 실행됩니다");
	//Ctrl + Space 누르면 생성자를 자동으로 입력해준다.
	public PersonDef() {
		this("이종호",false, 20); // 무조건 첫번째에 실행되야 한다
//		실행되면서 각각의 데이터에 맞는 타입에 들어가서 위에 데이터값으로 초기화가된다.
//		따라서 실행결과는 아래 3개로 통일된다.
//		Person [idx=0, name=이종호, gender=true, age=20, date=2022.01.21(금) 13.11]
//		Person [idx=0, name=이종호, gender=true, age=20, date=2022.01.21(금) 13.11]
//		Person [idx=0, name=이종호, gender=true, age=20, date=2022.01.21(금) 13.11]
		
		System.out.println("생성자가 입력됩니다");
		
		date = new Date();
		
//		this: 현재 클래스
//		super: 부모 클래스
//		this(인수): 현재 클래스의 다른 생성자를 의미
//		super(인수): 부모 클래스의 기본 생성자를 의미 > 따라서 Person의 기본 생성자를 적어줘야 함.
	
//		this()와 super()는 반드시 생성자의 첫 문장으로 사용해야 함
//		this()
//		super() 이런 식으로 불가
	}
//	데이터를 넘겨받아 멤버 변수를 초기화 시키는 생성자
//	지역변수의 이름이 멤버 변수의 이름과 같으면 !!지역변수!!의 이름이 - {}안에 있는거 - 우선권이 있음
//		우클릭 > source > O(Constructor using Field) Alt Shift O
//		중괄호 안에 있는 지역변수를 class 기본 변수로 지정하여 초기화
	public PersonDef(String name, boolean gender, int age) {

		super(); //부모 class의 기본 생성자를 실행하라 라는 의미.
		idx = ++count; //실행되는 순간 1이 증가되어 다음 실행 때 1이 추가
		this.name = name; //this.함수를 씀으로써 중괄호 안에 있는 변수를 지정
		this.gender = gender;
		this.age = age;
		date = new Date(); // 자동으로 컴퓨터의 시간 출력하기
		
	}
	
	

//	Alt Shift s s> generate toString (s) > 를 눌러서 현재 class의 데이터를 표시해줄 수 있음
//	class 설계 마지막으로 넣어서 내부 데이터 표시
	@Override
	public String toString() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd(E) HH.mm");
		return "Person [idx=" + idx + ", name=" + name + ", gender=" + gender +
				", age=" + age + ", date=" + sdf.format(date) + "]";
	}
	
//	getters & setters 메소드를 정의한다.
//	목적: 멤버 변수가 private 권한을 사용할 경우 이 권한의 적용이 너무 엄격해서
//		  꼭 필요한 경우라 하더라도 private 권한이 설정된 멤버 변수에 접근할 수 없다.
//	 	  따라서 예외적 접근을 위해 getters & setters를 설정하여 사용한다.
//	만드는 방법: source - getter and setters (Alt Shift s > r)
	public int getIdx() {
		return idx;
	}
	public void setIdx(int idx) {
		this.idx = idx;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public boolean isGender() { //boolean 값이기 때문에 get대신 is로 쓴다.
		return gender;
	}
	public void setGender(boolean gender) {
		this.gender = gender;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Date getDate() {
		return date;
	}
	public void setDate(Date date) {
		this.date = date;
	}	
}

 

수업 class 선언 노트

아래는 수업때 정리해논 것. 위에 보기쉽게 풀어놓았다

혹시 모를 참조용

public class PersonTestDef {
	public static void main(String[] args) {
		
//		생성자는 = Person(class 이름)
//		생성자를 만들지 않았지만 자바 컴파일러가 자동으로 생성해준 생성자
//	 	 > 기능이 없기때문에 동작하는게 없음
		PersonDef person = new PersonDef();
		
//		@뒤의 숫자는 해쉬코드(주소) = 저장되있는 메모리의 위치주소
		System.out.println(person);
//		Person@2a18f23c

//		사용빈도가 높기 때문에 객체에 저장되있는 내용을 출력하는 toString이 자동으로 붙여진다.
//		class 파일 데이터 출력을 하려면 class 파일 자체에서 @override를 해줘야 함.
//		System.out.println(person.toString());
		
//		overloading이 되어 지역변수가 우선권이 되는 class 
		PersonDef person2 = new PersonDef("이종호", true, 20);
		System.out.println(person2);
		
//		변수가 private일 때 getter를 사용해서 getName이라는 getter를 생성하여 데이터 추출 가능
		System.out.println(person2.getName());
		
		PersonDef person3 = new PersonDef("강남구", false, 30);
		System.out.println(person3);

//		name 변수에 "홍길동"을 setter를 통해 넣어줌
		person3.setName("홍길동");
		System.out.println(person3.getName());
		
		
//		static을 사용해서 index를 1씩 증가시켜주도록 함
		System.out.println(PersonDef.count); //class를 사용하여 접근
		System.out.println(person3.count); // 두가지 방법 가능
		person2.count = 100;
		System.out.println(person2.count);
		System.out.println(person3.count); // 동일 메모리를 사용하기 때문에 100으로 변경됨.
	}
}
728x90