클래스
재사용
이 가능하도록 모아 놓은 것필드(field)
와 객체의 행동을 나타내는 메소드(Method)
로 구성됩니다. 즉, 필드란 클래스에 포함된 변수를 의미합니다. 또한, 메소드란 어떠한 특정 작업을 수행하기 위한 명령문의 집합이라고 할 수 있습니다.추상화
라는 개념을 직접 구현한 것이라 할 수 있습니다.
- 주어이다.
모든 문장 맨 앞에 클래스가 나오고 영어는 맨 앞을 항상 대문자로 적는다.따라서 클래스는 주어이고, 대문자로 시작한다.- 타입이다.
- 클래스는 추상적인 개념이고 이 클래스 안에는 필드가 존재한다.
- 추상적인 것을 바로 사용할 수 없기 때문에 그 필드들을 구체화시킨 대상이 필요하다. 이러한 것들을
객체
라고 부르고 영어로는instance variable
이라고 부른다. (붕어빵)
사물
또는 개념
을 구체화한 물체객체의 설명
1. Tv t;
Tv클래스 타입의 참조변수 t를 선언한다. 메모리에 참조변수 t를 위한 공간이 마련된다.
2. t = new Tv();
연산자 new에 의해 Tv 클래스의 인스턴스가 메모리의 빈 공간에 생성된다.
3. t.channel = 7;
참조변수 t에 저장된 주소에 있는 인스턴스의 멤버변수 channel에 7을 저장한다.
4. t.channelDown();
참조변수 t가 참조하고 있는 Tv인스턴스의 channelDown메서드를 호출한다.
객체로 구체화
해서 만드는 작업을 객체화라고 하여 instance화 라고 한다. class 클래스명 {
// 멤버변수 정의
변수타입 변수명;
…
// 멤버함수(메소드) 정의
public 리턴타입 함수명() {
실행 명령어;
}
}
클래스는 추상적인 틀이기 때문에 먼저 객체화를 진행한다.
클래스명 객체명 = new 클래스명();
객체.변수
객체.메소드()
Heap
)에 할당되고 할당된 필드의 주소값을 기억하는 것이 객체이다. class Animal {
String name;
// setter 메소드 아님
public void setName(String name) {
this.name = name;
}
}
public class Class {
public static void main(String[] args) {
Animal cat = new Animal();
cat.setName("boby");
Animal dog = new Animal();
dog.setName("happy");
System.out.println(cat.name);
System.out.println(dog.name);
}
}
class Student1 {
String name;
int eng;
int kor;
Student1() {
name = " ";
eng = 0;
kor = 0;
}
// this는 내 자신을 가르킨다.
Student1(String name, int eng, int kor) {
this.name = name;
this.eng = eng;
this.kor = kor;
}
// 이름을 출력하는 메소드
public void printName() {
System.out.println("학생의 이름은 " + name + "입니다.");
}
// 성적을 출력하는 메소드
public void printScore() {
System.out.println("영어 점수는 " + eng + "입니다.");
System.out.println("국어 점수는 " + kor + "입니다.");
}
// 이름과 총점을 출력하는 메소드
public void printInfo() {
System.out.println("제 이름은 " +name+ "이고, 점수는 " + (eng + kor) + "입니다.");
}
}
public class ClassConst {
public static void main(String[] args) {
Student1 st = new Student1();
// 멤버 변수 값 저장(사용)
st.name = "홍길동";
st.eng = 90;
st.kor = 100;
Student1 st3 = new Student1("홍길동", 90, 100);
// 멤버 함수 사용
st.printName(); // 이름출력
st.printScore(); // 점수출력
st.printInfo(); // 정보출력
Student1 st1 = new Student1("김유신", 90, 100);
st1.printInfo();
Student1 st2 = new Student1("이순신", 90, 100);
st2.printInfo();
// 생성과 초기화를 동시에
// int a; // 선언
// a = 10; // 초기화
// int a = 10;
}
}
클래스 배열 선언
클래스명[] 배열명 = {
new 생성자(),
new 생성자(),
...
};
→ 배열명은 주소값을 가지고 있다.
String[] arr = new String[3];
→ 3개의 주소값을 만드는데, 거기에는 null이 담긴다.
그래서 그냥 부르면 'nullException'이라는 오류가 발생한다.
값을 넣어서 출력하면 arr에 주소값에 있던 값들이 출력이 된다.
배열명[idx] 방이 객체를 의미하게 된다.
배열명[idx].변수
배열명[idx].메소드()
기본 생성자
라고 하며, 만약 직접 생성자를 선언하게 되면 기존에 있던 기본 생성자는 사라지게 된다. Student1() {
name = " ";
eng = 0;
kor = 0;
}
// this는 내 자신을 가르킨다.
Student1(String name, int eng, int kor) {
this.name = name;
this.eng = eng;
this.kor = kor;
}
클래스의 필드를 똑같이 복사해서 메모리에 할당해주고 할당된 필드의 주소값을 가지고 온다. 이 주소값을 객체에 넣어놓고 사용한다. (객체화의 목적
)
생성자는 호출 시 내부의 내용을 모두 수행한다. (초기화의 목적
)
생성자 단축키 : Alt + Shift + s → o
객체지향 프로그래밍에서 객체의 데이터는 객체 외부에서 직접적으로 접근하는 것을 막는다. 객체 데이터를 외부에서 읽고 변경시 객체의 무결성이 깨질 수 있기 때문이다. 따라서, 객체지향 프로그래밍에서는 메소드를 통해 데이터를 변경하는 방법을 선호한다. 데이터는 외부에서 접근하지 않도록 막고, 메소드는 공개해서 외부에서 메소드를 통해 데이터에 접근하도록 유도한다. (메소드는 매개값을 검증해서 유효한 값만 데이터로 저장할 수 있기 때문이다.)
▶ 이런 역할을 하는 메소드 : Setter
외부에서 객체의 데이터를 읽을 때도 메소드를 사용하는 것이 좋다. 객체 외부에서 객체 필드값을 사용하기 부적절한 경우가 있다. 이런 경우 메소드를 필드값을 가공 후, 외부로 전달한다.
▶ 이런 역할을 하는 메소드 : Getter
→ 요약 : 피드값에 부적절한 값이 대입되는 것을 막기 위해서 사용한다.
class stat {
private int power;
private int dex;
private int intel;
public int getPower() {
return power;
}
public void setPower(int power) {
// 음수면
if(power < 0) {
// 0으로 맞춰준다.
this.power = 0;
// 0 위에면 this.power = power 실행
// 매개변수에 온 power값을 전역변수에 넣어준다.
} else {
this.power = power;
}
}
public int getDex() {
return dex;
}
public void setDex(int dex) {
if(dex < 0) {
this.dex =0;
} else {
this.dex = dex;
}
}
public int getIntel() {
return intel;
}
public void setIntel(int intel) {
if(intel < 0) {
this.intel = 0;
} else {
this.intel = intel;
}
}
}
public class GetterSetter {
public static void main(String[] args) {
stat character = new stat();
character.setPower(999);
character.setDex(999);
character.setIntel(999);
System.out.println("나의 힘능력치는 : " + character.getPower());
System.out.println("나의 민첩능력치는 : " + character.getDex());
System.out.println("나의 지능능력치는 : " + character.getIntel());
}
}
클래스 안에서 선언하여 사용한다.
public static 리턴타입 메소드명(매개변수) {
실행할 코드;
// 리턴이 있을 경우
return 값(변수);
}
public static void myprint() {
System.out.print("홍길동");
System.out.println();
}
메소드명()
myprint();
Main()
메인 메소드도 메소드이다.
단, 자바에서는 프로그램 실행의 시작점이므로
꼭 있어야 하는 함수이며, 다른 이름으로 사용할 수 없다.
매개변수(Parameter)
메소드에 입력으로 값을 전달하기 위한 변수
여러개의 변수를 입력으로 줄 수 있으며 ','로 구분한다.
반환타입/반환값(Ruturn Type/Return Value)
메소드 처리가 완료된 후 어떤 값을 반환할 경우 사용한다.
→ return total;
→ return score;
단, 메소드 정의시 반환타입과 반환값의 타입이 일치해야 한다. 메소드 정의시 'void(공허한)'로 정의하면 반환값이 없다는 것이다.
* 두수를 입력받아 사칙연산(+-/*)를 하는 메소드를 만드세요.
*
*
사용예 calc(6, 3) 메소드를 호출하면 아래와 같이 출력
더하기 9
빼기 3
곱하기 18
나누기 2
*/
calc(6, 3);
}
public static void calc(int a, int b) {
System.out.println("더하기\t" +(a+b));
System.out.println("빼기\t" + (a-b));
System.out.println("곱하기\t" + (a*b));
System.out.println("나누기\t" + (a/b));
}
/*
*메뉴를 표시하는 기능을 함수로 만들어 재사용하여 아래처럼 출력하세요.
*
* hint)
* 메소드의 입력파라메터로 메뉴명과 가격을 입력받는다(String name, int price)
* 리턴 값으로는 price를 다시 리턴받는다.
* 이 리턴값을 총액 계산시 사용한다.
*
결과
자장면 5000원
짬뽕 6000원
탕수육 10000원
====================
총액 21000원
*/
int total = printMenu("자장면", 5000);
total += printMenu("짬뽕", 6000);
total += printMenu("탕수육", 10000);
System.out.println("==================");
System.out.println("총액\t" + total + "원");
}
public static int printMenu(String name, int price) {
System.out.printf("%s\t%d원", name, price);
System.out.println();
return price;
}
● 반복적으로 사용하는 코드들을 한 곳에 모아 코드를 재사용하기 위해
● 불필요한 중복 코드를 메소드로 정의하여 코드의 가독성을 높여주기 위해
● 현업에서는 남이 이미 정의해 놓은 함수를 재사용하는 일이 대부분이다.