주의할 점: 언어의 늪에 빠지지말고 일단 학습하여 흐름을 눈에 익힌 후에 개념을 이해하자
클래스의 정의
- 데이터와 그 데이터를 처리하기 위한 메소드를 가짐
- 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으로 변경됨.
}
}
'국비과정 > 자바 선행학습 (1-17~1-21,22)' 카테고리의 다른 글
자바 선행학습 5일차 (마지막) - class 생성 예시 (0) | 2022.01.22 |
---|---|
자바 선행학습 5일차 (마지막) - ArrayList (0) | 2022.01.22 |
자바 선행학습 4일차 - class & method & 반복문게임 (0) | 2022.01.20 |
자바 선행학습 3일차 - Random, refactoring, 더블 for문, while & do-while, Date, SimpleDateFormat, equals(), String method (0) | 2022.01.19 |
자바 선행학습 2일차 - for , 향상된 for, switch random (0) | 2022.01.19 |