1. 클래스 생성
class Tv { // Tv 클래스 = 설계도
String color;
boolean power;
int channel;
void power() {
power = !power;
}
void channelUp() {
channel++;
}
void channelDown() {
channel--;
}
}
2. 객체 생성
Tv t = new Tv(); // Tv 인스턴스의 주소를 저장하는 참조변수 t
3. 객체 사용
t.channel = 7; // Tv의 멤버변수 channel의 값을 7로
t.channelDown(); // Tv의 메서드 호출
참조변수의 배열
다양한 타입의 데이터를 객체 배열을 통해 저장할 수 있다
객체의 메모리를 따로 생성하는 과정이 별도로 필요함
Tv[] tvArr = new Tv[3]; // 길이가 3인 Tv타입의 참조변수 배열
Tv[] tvArr2 = { new Tv(), new Tv(), new Tv() };
사용자 정의 타입으로 데이터와 함수의 결합이다
class Variables {
int iv; // 인스턴스 변수
static int cv; // 클래스 변수 (static 변수, 공유변수)
void method() {
int lv = 0; // 지역변수
}
}
class Card {
// 인스턴스 변수 : 카드 객체마다 다르게 적용
String kind; // 스페이드, 다이아, 하트, 클로버
int no; // 1 ~ 13
// 클래스 변수 : 카드 객체에 공통적으로 적용
static int width;
static int height;
}
선언 위치에 따라 변수의 종류가 달라진다
변수의 종류 | 선언 위치 | 생성시기 | 소멸시기 |
---|---|---|---|
클래스 변수(cv) | 클래스 영역 | 클래스가 메모리에 올라갈 때 | 프로그램 종료 시 |
인스턴스 변수(iv) | 클래스 영역 | 인스턴스가 생성되었을 때 | 인스턴스 소멸 시 |
지역변수(lv) | 클래스 영역 이외의 영역 | 변수 선언문이 수행되었을 때 | 블럭을 벗어날 때 |
클래스 변수
static
키워드를 사용하여 선언하고 어디서든 사용할 수 있다static
으로 정의해서 사용하여 메모리 절약인스턴스 변수
지역 변수
class InitTest {
int x; // 인스턴스 변수
int y = x; // 인스턴스 변수
void method1() {
int i; // 지역변수
int j = i; // 지역변수를 초기화하지 않고 사용하여 에러
}
}
class Car {
// 명시적 초기화 (간단 초기화)
static int[] arr = new int[10];
int door = 4;
Engine e = new Engine();
// 초기화 블럭 (복잡 초기화)
static {
int wheel = 4;
for (int i = 0; i < arr.length; i++)
arr[i] = (int) (Math.random() * 10) + 1;
}
}
null
이기 때문에 객체를 생성하는 것이 중요하다{ }
, static { }
으로 작성한다어떠한 특정 작업을 수행하기 위한 명령문의 집합
// 메서드 문법
void A(parameter){} // 인자를 받고 리턴값이 없음
void B(){} // 인자를 받지 않으며 리턴값이 없음
dataType C(parameter){ return } // 인자를 받으며 해당 데이터 타입으로 리턴
dataType D(){ return } // 인자를 받지 않으며 해당 데이터 타입으로 리턴
// add 메서드 작성
class Test {
int add(int x, int y) { // int 인자를 받아 int 값을 리턴하는 메서드
return = x + y; // 두 int 인자를 더한 값을 리턴
}
}
Test test = new Test(); // 인스턴스 생성
int result = test.add(3, 9); // 메서드 호출
// return문
void print(String a) {
System.out.println(a); // 반환 타입이 void라 return 생략 가능
}
int minus(int a, int b) {
int result = a - b;
return result; // 반환 타입이 명시되어있어 return 생략 불가
}
int max(int a, int b) {
if(a > b)
return a; // 조건식이 거짓일 경우 return이 없어서 에러
}
return
문을 만나면 호출한 메서드로 되돌아와 이후의 문장을 수행한다반환 타입이 void가 아니라면 반드시 return문이 필요
기본형 매개변수 : 변수의 값을 읽기만 할 수 있다
참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다
// 기본형 매개변수 예제
class Data {
int x;
}
public class Ex {
public static void main(String[] args) {
Data d = new Data();
d.x = 10;
System.out.println("main() : x = " + d.x); // main() : x = 10
change(d.x); // change() : x = 1000
System.out.println("main() : x = " + d.x); // main() : x =
}
static void change(int x) { // 기본형 매개변수 (읽기만 가능)
x = 1000; // 지역변수
System.out.println("change() : x = " + x);
}
}
// 참조형 매개변수 예제
class Data2 {
int x;
}
public class aaaa {
public static void main(String[] args) {
Data2 d = new Data2();
d.x = 10;
System.out.println("main() : x = " + d.x); // main() : x = 10
change(d); // change() : x = 1000
System.out.println("main() : x = " + d.x); // main() : x = 1000
}
static void change(Data2 d) { // 참조형 매개변수 (읽기, 쓰기 가능)
d.x = 1000; // 참조하는 주소 d의 x를 바꿈
System.out.println("change() : x = " + d.x);
}
}
// 참조형 반환타입 예제
class Data3 {
int x;
}
public class aaaa {
public static void main(String[] args) {
Data3 d = new Data3();
d.x = 10;
Data3 d2 = copy(d);
System.out.println("d.x = " + d.x); // 10
System.out.println("d2.x = " + d2.x); // 10
}
static Dat3 copy(Data3 d) { // 참조형 반환타입 (객체의 주소 리턴)
Data3 tmp = new Data3(); // 객체 tmp 생성
tmp.x = d.x; // d.x의 값을 tmp.x에 복사
return tmp; // 복사한 객체의 주소 리턴
}
}
class MyMath {
long a, b; // 인스턴스 변수
// 인스턴스 메서드
long add() {
return a + b;
}
// 클래스 메서드 (static 메서드)
static long add(long a, long b) { // 지역 변수
return a + b; // 지역 변수 (가까운 쪽 변수)
}
}
public class Main {
public static void main(String[] args) {
// 클래스 메서드 호출 (객체 생성없이 호출 가능)
System.out.println(MyMath.add(100L, 200L));
MyMath mm = new MyMath(); // 인스턴스 생성
mm.a = 100L; // 인스턴스 변수
mm.b = 200L;
System.out.println(mm.add()); // 인스턴스 메서드 호출
}
}
참조변수.메서드이름()
으로 호출클래스이름.메서드이름()
으로 호출class Test {
int iv; // 인스턴스 변수
void instanceMethod() {} // 인스턴스 메서드
static int cv; // 클래스 변수
static void staticMethod() {} // 클래스 메서드
// 인스턴스 메서드
void instanceMethod() {
System.out.println(iv); // 인스턴스 변수 사용가능
System.out.println(cv); // 클래스 변수 사용가능
}
void instanceMethod2() {
instanceMethod(); // 다른 인스턴스 메서드 호출가능
staticMethod(); // 클래스 메서드 호출가능
}
// 클래스 메서드
static void staticMethod() {
System.out.println(iv); // 인스턴스 변수 사용불가
System.out.println(cv); // 클래스 변수 사용가능
}
static void staticMethod2() {
instanceMethod(); // 인스턴스 메서드 호출불가
staticMethod(); // 클래스 메서드 호출가능
}
}
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 (long)( a + b ) } // 반환타입은 오버로딩과 무관
long add(int a, long b) { return a + b; } // 매개변수 타입이 다르지만
long add(long a, int b) { return a + b; } // ambiguous 에러
// 오버로딩 성립 O
// 매개변수는 다르지만 같은 의미의 기능 수행
int add(int[] a) {
int result = 0;
for(int i = 0; i < a.length; i++){
result += a[i];
}
return result;
}
int add(int i, int j) {
return i + j;
}
double add(int i, double j) {
return i + j;
}
String add(String s) {
return "Hello" + s;
}
String add(String s, int i) {
return null;
}
class Car {
String carname = "포니";
public Car() { // 기본 생성자 함수
System.out.println("기본 생성자");
}
public Car(String color) { // 오버로딩 생성자 함수
System.out.println("오버로딩 생성자");
}
}
인스턴스가 생성될 때마다 호출되는 인스턴스 초기화 메서드
// this
class Car3 {
String carname;
public Car3() {
this.carname = "포니";
}
public Car3(String name) {
this.carname = name; // Car3.carname과 같은 의미
}
}
// this()
class Car {
private String modelName;
private int modelYear;
private String color;
private int maxSpeed;
private int currentSpeed;
Car(String modelName, int modelYear, String color, int maxSpeed) {
this.modelName = modelName;
this.modelYear = modelYear;
this.color = color;
this.maxSpeed = maxSpeed;
this.currentSpeed = 0;
}
Car() {
this("소나타", 2012, "검정색", 160); // 다른 생성자를 호출
}
public String getModel() {
return this.modelYear + "년식 " + this.modelName + " " + this.color;
}
}
public class Method05 {
public static void main(String[] args) {
Car tcpCar = new Car(); System.out.println(tcpCar.getModel());
}
}