클래스 정의 및 사용
우리가 만든 클래스를 사용하려면, 그 클래스의 '인스턴스(실체 instance)'를 생성해야 함.
구문
클래스이름 변수이름 = new 생성자();
생성자(): 클래스의 이름과 동일, 클래스의 멤버변수들을 초기화
new 로 생성하는 instance 들은 지역변수와는 달리 인스턴스가 생성될 때 (자동으로) 초기화가 된다.
특별히 초기화를 할 값들이 지정되어 있지 않을 때는 각 변수 타입의 기본값(디폴트 값)으로 초기화가 됨
boolean -> false, 숫자타입(int, double, ...) -> 0
String, 참조 타입(클래스) -> null
지역변수: 메소드 안에서 선언된 변수
지역변수는 사용하기 전에 반드시 초기화를 해줘야 함.
클래스:
우리가 만들고자 하는 대상의 '상태' 와 '기능' 을 함께 가지고 있는 '데이터 타입'
상태(속성, 필드) -> 클래스의 멤버변수로 정의
field, attribute, member variable 라고 함
기능(동작) -> 클래스의 멤버메소드로 정의
behavior, member method 라고 함
일반적으로
멤버변수(필드)는 private 으로 설정.
멤버메소드는 public 으로 설정.
생성자(Constructor)
생성자의 목적: 인스턴스 생성시 멤버변수들의 초기화
생성자의 이름은 반드시 클래스의 이름과 동일
생성자는 리턴 타입이 없다.
생성자도 매개변수(argument)를 가질 수 있다.
생성자도 오버로딩(overload) 가능
클래스를 만들 때, 생성자를 따로 만들지 않으면 '디폴트 생성자(default constructor)'를 자동으로 만들어줌.
디폴트 생성자란 : 매개변수가 없는 생성자. 모든 멤버변수는 기본값으로 초기화
(주의) 클래스에서 하나 이상의 생성자를 만들게 되면, 자동으로 디폴트 생성자를 만들어 주지 않습니다.
(강력권장) 아무일도 안하더라도 디폴트 생성자는 반드시 만들어 주자.
public class Circle {
// 원의 상태(속성) -> 멤버변수 (필드)
double radius;
// 생성자
// ↓ 기본 생성자
public Circle() {
System.out.println("Circle() 생성자 호출");
System.out.println("반지름: " + radius);
}
// ↓ 생성자 오버로딩 가능.
public Circle(double r) {
System.out.println("Circle(" + r + ") 생성자 호출");
radius = r; // 멤버변수 초기화
System.out.println("반지름: " + radius);
}
// 원의 동작(기능) -> 메소드
// 원의 둘레 계산
public double calcPerimeter() {
return 2 * Math.PI * radius;
}
// 원의 넓이 계산
public double calcArea() {
return Math.PI * radius * radius;
}
package com.lec.java.class02;
public class Rectangle {
// 직사각형의 속성
// 너비, 높이
private double width;
private double height;
// 디폴트 생성자
public Rectangle() {
width = 100; // 디폴트 값을 지정해줄수 있다
height = 100;
System.out.println("가로: " + width);
System.out.println("세로: " + height);
}
// 너비와 높이를 매개변수로 받아 초기화 하는 생성자
public Rectangle(double w, double h) {
width = w;
height = h;
System.out.println("가로: " + width);
System.out.println("세로: " + height);
}
// 직사각형의 동작
// 사각형의 둘레
public double calcPerimeter() {
return (width + height) * 2;
}
// 사각형의 넓이
public double calcArea() {
return width * height;
}
package com.lec.java.class02;
public class Class02Main {
public static void main(String[] args) {
System.out.println("클래스 연습");
Circle c1 = new Circle();
Circle c2 = new Circle(3);
double perimeter = c1.calcPerimeter();
System.out.println("c1의 둘레: " + perimeter);
perimeter = c2.calcPerimeter();
System.out.println("c2의 둘레: " + perimeter);
double area = c1.calcArea();
System.out.println("c1의 넓이: " + area);
area = c2.calcArea();
System.out.println("c2의 넓이: " + area);
// Rentangle 인스턴스 2개이상 생성, 동작시키기
Rectangle r1 = new Rectangle();
System.out.println("r1 의 둘레: " + r1.calcPerimeter());
System.out.println("r1 의 넓이: " + r1.calcArea());
Rectangle r2 = new Rectangle(2, 3);
System.out.println("r2 의 둘레: " + r2.calcPerimeter());
System.out.println("r2 의 넓이: " + r2.calcArea());
System.out.println("프로그램 종료");
} // end main()
} // end class Class02Main
* 캡슐화, 은닉, 추상화
클래스 안에 필요한 '속성' 과 '행동' 을 멤버로 묶고
외부에서의 '직접적인 접근을 제한'(private)하여 객체의 데이터와 메소드를 은닉(hiding)하고,
사용자에게는 필요한 기능만 제공하여 추상화(abstraction) 하는
객체지향 기술을 '캡슐화(encapsulation)' 라고 한다
클래스의 멤버변수를 접근하기 위한 기능을 제공하는 메소드를 getter , setter 라 한다.
이클립스의 source generator 기능을 사용하면, 클래스 작성시 생성자, getter / setter 메소드 등을 손쉽게 작성 가능.
public class Class03Main {
public static void main(String[] args) {
System.out.println("Getter & Setter");
Number n1 = new Number(100);
// n1.num = 300; not visible 에러
System.out.println(n1.getNum());
n1.setNum(200);
System.out.println(n1.getNum());
System.out.println("프로그램 종료");
} // end main()
package com.lec.java.class03;
public class Number {
// 멤버변수
private int num;
private boolean enabled;
// 생성자
// 디폴트 생성자
public Number() {}
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
// 매개변수 있는 생성자
public Number(int num) {
this.num = num; // this: 인스턴스 자기자신
}
// 메소드
// getter: 멤버 변수의 값을 리턴해 주는 메소드
// setter: 멤버 변수의 값을 변경해 줄 수 있는 메소드
public int getNum() {
return this.num;
}
public void setNum(int num) {
this.num = num;
}
}
package com.lec.java.class03;
public class Numeric {
private char ch;
private byte operator;
private int operand1;
private int operand2;
// 이클립스의 source generator 를 사용하면 손쉽게 자동 코드 생성
// 방법1. 우클릭후 Sources 메뉴
// 방법2. ALT + SHIFT + S 누른후 팝업에서 선택
public Numeric() {
super();
}
public Numeric(char ch, byte operator, int operand1, int operand2) {
super();
this.ch = ch;
this.operator = operator;
this.operand1 = operand1;
this.operand2 = operand2;
}
public char getCh() {
return ch;
}
public void setCh(char ch) {
this.ch = ch;
}
public byte getOperator() {
return operator;
}
public void setOperator(byte operator) {
this.operator = operator;
}
public int getOperand1() {
return operand1;
}
public void setOperand1(int operand1) {
this.operand1 = operand1;
}
public int getOperand2() {
return operand2;
}
public void setOperand2(int operand2) {
this.operand2 = operand2;
}
클래스 안에서 this :
객체 내에서 자기자신(인스턴스)을 가리킴
메소드 체이닝 (method chaining)
자기자신을 리턴하여, 연이어 메소드 호출 가능케 하는 메소드 설계
보통 setter 와 이와 같은 동작을 수행하는 메소드들에 적용하면 좋다
package com.lec.java.class04;
public class Number {
private int num = 100; // 멤버변수 선언시 초깃값 명시 가능.
// 생성자
// 기본생성자
public Number() {
super();
}
// 매개변수 받는 생성자
public Number(int num) {
super();
this.num = num;
}
// getter, setter
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public Number add(Number x) {
this.num += x.num;
return this; // 메소드 체이닝 핵심. this.를 리턴
}
public Number sub(Number x) {
this.num -= x.num;
return this;
}
}
public class Class04Main {
public static void main(String[] args) {
System.out.println("this & 메소드 체이닝");
Number n1 = new Number();
System.out.println("n1.num = " + n1.getNum());
Number n2 = new Number(123);
System.out.println("n2.num = " + n2.getNum());
n1.add(n2);
System.out.println("n1.num = " + n1.getNum());
Number n3 = new Number(30);
n1.add(n3);
n1.add(new Number(100));
System.out.println("n1.num = " + n1.getNum());
// n1 <- 353
n1.add(n3).add(n3).add(n2).add(new Number(1));
System.out.println("n1.num = " + n1.getNum());
n3.add(n3).sub(n1);
// 30 + 30 - 537
System.out.println("n3.num = " + n3.getNum());
System.out.println("프로그램 종료");
} // end main()
메소드 체이닝 : method chaining
* this는 자기자신 인스턴스 입니다.
* 메소드에서 this를 return 하면 호출한 쪽에서 곧바로 연이어 호출 가능
* 객체.메소드1().메소드2().메소드2()....
* 메소드체이닝을 사용하면, 반복되는 지루한 코딩을 줄여줄수 있다.
* 프로그래밍시 각 메소드가 무엇을 리턴하는지는 항상 예의주시해야 합니다.
package com.lec.java.class06;
public class Score {
// 멤버변수 :
private String name; // 학생 이름 String
private int kor; // 국어점수 int
private int math; // 수학점수 int
private int eng; // 영어점수 int
// 생성자: 멤버 변수 초기화
// 1) 디폴트 생성자
public Score() {}
// 2) 매개변수 받는 생성자 (이름, 국어점수, 수학점수, 영어점수)
public Score(String name, int kor, int eng, int math) {
this.name = name;
this.kor = kor;
this.eng = eng;
this.math = math;
}
// 메소드
// 총점계산 메소드
// 메소드이름 :calcTotal()
// 리턴타입 : int
public int calcTotal() {
int total = 0;
total = kor + eng + math;
return total;
} // end calcTotal()
// 평균계산 메소드
// 메소드 이름 : calcAvg()
// 리턴타입 : double
public double calcAvg() {
double avg = 0;
avg = (double)calcTotal() / 3;
return avg;
} // end calcAvg()
// 메소드
// 이름: displayInfo()
// 리턴: void
// 매개변수: none
// 학생의 이름, 국어, 영어, 수학 점수 출력
public void displayInfo() {
System.out.print(name + " : ");
System.out.print(kor + " : ");
System.out.print(eng + " : ");
System.out.print(math + " : ");
System.out.println();
} // end displayInfo()
// getter & setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
public int getEng() {
return eng;
}
public void setEng(int eng) {
this.eng = eng;
}
package com.lec.java.class06;
// 객체의 배열
public class Class06Main {
public static void main(String[] args) {
System.out.println("클래스 연습 : 성적처리");
Score [] arrScore = new Score[3];
System.out.println("arrScore =" + arrScore);
System.out.println("arrScore[0] =" + arrScore[0]); // null
//System.out.println(arrScore[0].calcTotal());
arrScore[0] = new Score("홍길동", 100, 80, 70);
arrScore[1] = new Score("손오공", 78, 23, 62);
arrScore[2] = new Score("나루토", 52, 93, 100);
for (int i = 0; i < arrScore.length; i++) {
arrScore[i].displayInfo();
System.out.println("총점: " + arrScore[i].calcTotal());
System.out.println("평균: " + arrScore[i].calcAvg());
}
System.out.println("----------------------");
Score [] arr = {
new Score("아이언맨", 10, 20, 33),
new Score("캡틴", 100, 100, 0),
new Score("토르", 54, 22, 91)
};
for(Score score : arr) {
score.displayInfo();
System.out.println("총점: " + score.calcTotal());
System.out.println("평균: " + score.calcAvg());
}
System.out.println("프로그램 종료");
} // end main()
} // end class Clas06Main
'JAVA' 카테고리의 다른 글
[JAVA] 상속 (0) | 2022.02.09 |
---|---|
[JAVA] 접근제한자, final, static (0) | 2022.02.09 |
[JAVA] 메소드 (0) | 2022.02.08 |
[JAVA] 형변환, 변수 (0) | 2022.02.08 |
[JAVA] 파일 입출력 (0) | 2021.11.21 |