클래스 변수명 = new 클래스();
public class Car{}
public class CarExam{
public static void main(String[] args) {
Car car = new Car();
}
}
클래스의 용도는 두가지가 있다. 하나는 API용이고 다른 하나는 실행용이다. API는 다른 클래스에서 이용할 목적으로 설계되고 실행 클래스는 main메소드를 제공하는 역할을 한다. 위 예에서 Car는 API용이고 CarExam은 실행 클래스이다.
public class Car{
//public Car(){} -> 자동 추가, 기본 생성자
}
public class CarExam{
public static void main(String[] args) {
Car car = new Car();
}
}
클래스명(){};
public Car(String name, int studentId, int birthData){...}
예제
public class Car {
String name;
int studentId;
int birthData;
public Car(String name, int studentId, int birthData){
this.name = name;
this.studentId = studentId;
this.birthData = birthData;
}
public void print(){
System.out.println("name = " + name);
System.out.println("studentId = " + studentId);
System.out.println("birthData = " + birthData);
}
}
public class CarExam {
public static void main(String[] args) {
Car car = new Car("kimminje", 100, 1999);
car.print();
}
}
->name = kimminje
studentId = 100
birthData = 1999
위 코드에서 Car 클래스는 생성자를 통해 현재 객체의 필드에 받은 값을 넣어주고 print 메소드를 통해 출력해주는 클래스로 구성되었다.
this라는 키워드는 객체 자신의 참조라는 뜻이며 위처럼 ‘this.필드’로 사용하면 객체 자신의 필드를 뜻한다.
public class Car {
String name;
int studentId;
int birthData;
public Car(String name, int studentId){
this.name = name;
this.studentId = studentId;
}
public Car(String name, int studentId, int birthData){
this.name = name;
this.studentId = studentId;
this.birthData = birthData;
}
public void print(){
System.out.println("name = " + name);
System.out.println("studentId = " + studentId);
System.out.println("birthData = " + birthData);
}
}
public class CarExam {
public static void main(String[] args) {
Car car1 = new Car ("minjekim",50);
Car car2 = new Car("kimminje", 100, 1999);
car1.print();
car2.print();
}
}
->name = minjekim
studentId = 50
birthData = 0
name = kimminje
studentId = 100
birthData = 1999
리턴타입 메소드명(){};
매개변수의 개수를 모를 경우 매개변수를 배열 타입으로 받으면 된다.
public class MethodExam {
static int sum(int[] value){
int sum = 0;
for (int i = 0; i<value.length; i++){
sum+=value[i];
}
return sum;
}
public static void main(String[] args) {
int s = sum(new int[]{1,2,3,4,5});
System.out.println(s);
}
}
-> 15
public class Cal {
public int plus(int x, int y){
return x+y;
}
public double plus(double x, double y){
return x+y;
}
}
public class Exam {
public static void main(String[] args) {
Cal sum = new Cal();
int int_plus = sum.plus(1,2);
double double_plus = sum.plus(1.5,2.8);
System.out.println("int_plus = " + int_plus);
System.out.println("double_plus = " + double_plus);
}
}
->int_plus = 3
double_plus = 4.3
public class Car {
String name;
int studentId;
int birthData;
public Car(String name, int studentId, int birthData){
this.name = name;
this.studentId = studentId;
this.birthData = birthData;
}
public void print(){
System.out.println("name = " + name);
System.out.println("studentId = " + studentId);
System.out.println("birthData = " + birthData);
}
}
public class CarExam {
public static void main(String[] args) {
Car car = new Car("kimminje", 100, 1999);
car.print();
}
}
public class Cal {
public static int plus(int x, int y){
return x+y;
}
public static double plus(double x, double y){
return x+y;
}
}
public class Exam {
public static void main(String[] args) {
int int_plus = Cal.plus(1,2);
double double_plus = Cal.plus(1.5,2.8);
System.out.println("int_plus = " + int_plus);
System.out.println("double_plus = " + double_plus);
}
}
->int_plus = 3
double_plus = 4.3
정적 메소드 내부에서 인스턴스 필드나 인스턴스 메소드를 사용할 수 없다
확인해보자
int i = 0;
static int j = 1;
void exam2(){}
static void exam3(){}
public static int exam2(){
//컴파일 에러
this.i = 1;
i=1;
this.exam2();
exam2();
//실행 성공
j=1;
exam3();
}
this 키워드를 통한 인스턴스 필드나 인스턴스 메소드에 접근이 안되는 것을 알 수 있다.
그러면 main 메소드도 static이니까 바깥에서 선언된 필드에 접근 못하나??
int i = 0;
static int j = 0;
public static void main(String[] args) {
//컴파일 에러
this.i=1;
i=1;
//실행 성공
j=1;
}
main 메소드도 똑같은 것을 확인할 수 있다.
public class 클래스 {
private static 클래스 singleton = new 클래스();
private 클래스(){}
static 클래스 getInstance(){
return singleton;
}
}
예제
public class Exam {
private static Exam singleton = new Exam();
private Exam(){}
static Exam getInstance(){
return singleton;
}
}
public class Main{
public static void main(String[] args) {
Exam exam1 = Exam.getInstance();
Exam exam2 = Exam.getInstance();
if (exam1==exam2){
System.out.println("같은 singleton 객체");
}else{
System.out.println("다른 singleton 객체");
}
}
}
->같은 singleton 객체