클래스 객체
제품 설계도 제품
TV 설계도 TV
붕어빵 기계 붕어빵
TV
속성 : 크기, 길이, 높이, 색상, 볼륨, 채널 등
기능 : 켜기, 끄기, 볼륨 높이기, 볼륨 낮추기, 채널 변경하기 등
class TV {
String color;
boolean power;
int channel;
void power() { power = !power; }
void channelUp() { channel++; }
void channelDown() { channel--; }
}
올바른 작성 예 설명
Hello2.java
public class Hello2 {} public class가 있는 경우,
class Hello3 {} 소프파일의 이름은 반드시 public class의 이름과 일치해야 한다
Hello2.java
class Hello2 {} publick class가 하나도 없는 경우,
class Hello3 {} 소스파일의 이름은 'Hello2.java', 'Hello3.java'둘 다 가능하다
잘못된 작성 예 설명
Hello2.java 하나의 소스파일에 둘 이상의 public class가 존재하면 안된다
public class Hello2 {} 각 클래스를 별도의 소스파일에 나눠서 저장하던가
public class Hello3 {} 아니면 둘 중의 한 클래스에 public을 붙이지 않아야 한다
Hello3.java
public class Hello2 {} 소스파일의 이름이 public class의 이름과 일치하지 않는다
class Hello3 {} 소스파일의 이름을 'Hello2.java'로 변경해야 맞다
hello2.java 소스파일의 이름과 public class의 이름이 일치하지 않는다
public class Hello2 {} 대소문자를 구분하므로 대소문까지 일치해야 한다
class Hello3 {} 그래서, 소스파일의 이름에서 'h'를 'H'로 바꿔야 한다
클래스명 변수명; // 클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); //클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장
Tv t; // Tv클래스 타입의 참조변수 t를 선언
t = new Tv(); // Tv인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장
t.channel = 7; // Tv인스턴스의 멤버변수 channel의 값을 7로 한다
t.channelDown(); // Tv인스턴스의 메서드 channelDown()을 호출한다
System.out.println("현재 체널은"+t.channel+" 입니다");
class Variables { // 1. 클래스 영역
int iv; // 인스턴스 변수
static int cv; // 클래스 변수(static변수, 공유변수)
void method() { // 2. 메서드 영역
int lv = 0; // 지역변수
}
}
// 코드중복이 발생
public static void main(String args[]) {
...
for(int i = 0; i < 10; i++) {
numArr[i] = (int)(Math.random()*10);
}
// *
for(int i = 0; i < 10; i++) {
System.out.printf("%d", numArr[i]);
}
System.out.printnl();
...
// *
for(int i = 0; i < 10; i++) {
System.out.printf("%d", numArr[i]);
}
System.out.printnl();
}
// 코드 중복된 부분을 메소드로 만들기!
static void printArr(int[] numArr) {
for(int i = 0; i < 10; i++) {
System.out.printf("%d", numArr[i]);
}
System.out.printnl();
}
public static void main(String args[]) {
...
for(int i = 0; i < 10; i++) {
numArr[i] = (int)(Math.random()*10);
}
printArr(numArr); // 배열을 출력, 메소드 호출
...
printArr(numArr); // 배열을 출력, 메소드 호출
}
반환타입 메서드이름 (타입 변수명, 타입 변수명, ...) { // 선언부
// 메서드 호출시 수행될 코드 // 구현부
}
int add (int a, int b) { // 선언부
int result = a + b; // 구현부
return result; // 구현부
}
int add(int x, int y) { // 매개변수, 지역변수 x, y
int result = x + y; // 지역변수 result
return result;
}
MyMath mm = new MyMath(); // 먼저 인스턴스를 생성한다
long value = mm.add(1L, 2L); // 메서드를 호출한다
long add(long a, long b) {
long result = a + b;
return result;
}
void printGugudan(int dan) {
if(!(2 <= dan && dan <= 9))
return; // dan의 값이 2 ~ 9가 아닌 경우, 호출한 곳으로 그냥 되돌아간다
for(int i = 1; i <= 9; i++) {
System.out.printf("%d * %d = %d%n", dan, i, dan * i);
}
return; // 반환 타입이 void이므로 생략가능, 컴파일러가 자동 추가
}
int multiply(int x, int y) {
int result = x * y;
return result;
}
// error return문이 없다
int max(int a, int b) {
if(a > b)
return a; // 참일 때만 return이 있기에 오류가 발생한다
}
// 수정
int max(int a, int b) {
if(a > b)
return a;
else
return b;
}
class EX {
public static void main(String[] args) {
System.out.println("Hello");
}
}
class test {
long a, b;
long add() { // 인스턴스 메서드, static이 안붙음 클래스메서드
return a+b;
}
static long add(long a, long b) { // 클래스메서드(static 메서드)
return a+b;
}
}
static 메서드는 인스턴스 변수(iv)를 사용할 수 없다(객체가 있을지 없을지 모르기 때문에 불가)
static 메서드는 인스턴스 메서드(im)를 호출할 수 없다
void println()
void println(boolean x)
void println(char x)
void println(char[] x)
void println(double x)
void println(float x)
void println(int x)
void println(long x)
void println(Object x)
void println(String x)
// 오버로딩X, 메서드 중복 정의
int add(int a, int b) {return a+b;}
int add(int x, int y) {return x+y;}
long add(int a, int b) {return a+b;}
// 오버로딩 O, 하지만 호출시에 인수값이 모호하여 에러가 발생할 수 있음
int add(int a, int b) {return a+b;}
int add(long a, int b) {return a+b;}
int add(int a, int b) {
System.out.println("int add(int a, int b) - ");
return a+b;
}
long add(long a, long b) {
System.out.println("long add(long a, long b) - ");
return a+b;
}
int add(int[] a) {
System.out.println("int add(int[] a) - ");
int result = 0;
for(int i = 0; i < a.length; i++)
result += a[i];
return result;
}
클래스이름 (타입 변수명, 타입 변수명, ...) {
// 인스턴스 생성 시 수행될 코드,
// 주로 인스턴스 변수의 초기화 코드를적는다
}
클래스이름(){} // 기본 생성자
Point(){} // Point클래스의 기본 생성자
class Car{
String color;
String gearType;
int door;
Car() {};
Car(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
class Car{
String color;
String gearType;
int door;
Car() {
this("white", "auto", 4)
};
Car(String color) {
this(color, "auto", 4)
}
Car(String color, String gearType, int door) { // 참조가 되는 생성자 함수
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
class Car{
String color;
String gearType;
int door;
Car(String color, String gearType, int door) {
// this.변수명 iv, 변수명 lv
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
this : 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다
모든 인스턴스메서드에 지역변수로 숨겨진 채로 존재
this(), this(매개변수) : 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용
class IntiTest {
int x;
int y = x;
// 지역변수는 메소드 호출시에만 잠시 생성이 되기 때문에 수동 초기화를 해주어야 한다
void methid1() {
int i;
int j = i; //Error, 지역변수를 초기화하지 않고 사용
}
}
class Car{
int door = 4; // 기본형(primitive type) 변수의 초기화
Engine e = new Engine(); // 참조형(reference type) 변수의 초기화
}
Car(String color, String geartype, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}