위로 아래

클래스

기본형

//class 이름 : Circle
//참조변수 이름 : C1

//클래스 선언 파일 
class Circle {
	// 필드 (객체의 속성)
	// 메서드 (객체의 동작)
}

//메인 메소드 파일
1. 정석형
Circle C1;
C1 = new Circle();

2. 축약형
Circle C1 = new Circle();

3. 변수 생략형 (객체를 두 번 이상 참조하지 않을 때)
new Circle();
  1. 참조변수는 stack 영역에 저장되어, 힙 영역에 있는 동적 객체의 주소를 가리키는 정적 데이터다.
  2. 클래스는 다른 패키지에서 import로 불러올 수 있다.
  3. 클래스는 public이나 default로만 선언할 수 있다. (protected, private는 불가능)

 

 

예시

더보기
------------------------같은 패키지에 Phone.java 파일-------------------------
class Phone {   // 클래스 (설계도)
	String model;   // 필드
	int value;   // 필드
	void print() {   // 메서드
		System.out.println(value + "만원 짜리 " + model + " 스마트폰");
	}
}

----------------------같은 패키지에 PhoneDemo.java 파일-----------------------
public class PhoneDemo {   // 메인 함수가 있는 클래스
	public static void main(String[] args) {   // 메인 함수
    	
        //firstPh 인스턴스 생성
		Phone firstPh = new Phone();   // 생성자
		firstPh.model = "갤러시 S8";
		firstPh.value = 100;
		firstPh.print();
        // 결과 : 100만원 짜리 갤럭시 S8 스마트폰
		
        //secondPh 인스턴스 생성
		Phone secondPh = new Phone();   // 두번째 객체
		secondPh.model = "G6";
		secondPh.value = 85;
		secondPh.print();
        // 결과 : 85만원 짜리 G6 스마트폰
        
        //thirdPh 인스턴스 생성
        Phone thirdPh = new Phone();   // 세번째 객체
		secondPh.print();
        // 결과 : 0만원 짜리 null 스마트폰
	}
}
------------------------같은 패키지에 Circle.java 파일-------------------------
public class Circle {
	double radius;   // 필드 
	
	double findArea () {   // 메소드 1
		return 3.14 * this.radius * this.radius;
	}
	
	void show(double x, double y) {   // 메소드 2
		System.out.printf("반지름=%.1f, 넓이=%.1f\n",x,y);
	}
}

----------------------같은 패키지에 CircleDemo.java 파일-----------------------
public class CircleDemo {
	public static void main(String[] args) {
		Circle C1 = new Circle();   // 인스턴스 생성
		C1.radius = 10.0;
		C1.show(C1.radius, C1.findArea());
	}
}

 

 

 


메인 메소드가 있는 클래스

기본형

public class 클래스 이름 {
	public static void main(String[] args){
		내용
    }
}

public : 접근 제어자. 어느 곳에서든 객체 참조 가능.

static : 모든 인스턴스들이 공통으로 사용한다. 컴파일 시 static이 먼저 정의되고 이후 다른 객체가 정의된다. static이 가장 먼저 정의되기 때문에, static 객체에서 static이 아닌 다른 객체를 호출하는 것은 순서상 불가능하다.

void : 함수가 종료된 후 리턴값이 없다.

String[] args : String 문자열, [] 배열, args 변수. 메인 메소드도 외부에서 데이터를 받을 수 있다. 자바를 실행할 때 터미널 명령어에 java (자바 실행) file (파일 이름) String0 String1 Strint3 ( 데이터 입력)하면 메인 함수에 문자열 데이터를 넣는다.

 

특징

  1. Java는 어플리케이션이 실행되면 메인 메소드부터 제일 먼저 실행한다.
  2. 가장 먼저 실행하기 때문에 메인 메소드를 따로 호출할 수는 없다.
  3. 파일 이름은 이 클래스 이름으로 지정해야 한다.

 

 


필드와 지역변수

필드

  1. 초기화 안 해도 0 또는 null의 기본값이 들어간다
  2. 클래스 전체에서 사용할 수 있다. (어디에서 선언해도 상관 없다)
  3. 모든 접근 지정자뿐만 아니라 static, final로 지정할 수 있다.

지역변수

  1. 초기화 안 하면 기본값이 없어서 오류난다
  2. 선언된 후부터 선언된 블럭까지만 사용할 수 있다.
  3. 접근 지정자, static은 모두 안 되고 final만 지정할 수 있다. (상수처럼)

예시

더보기
public class LocalVariableDemo {
	public static void main(String[] args) {
		int a = 0;
		double b;
		
		//System.out.print(b);   // 지역변수는 기본값이 없으므로 안 됨
		//System.out.print(a+c);   // 순서가 달라서 오류. c가 뒤에서 정의되었다.
		
		int c = 0;  
		//public double d = 0.0;   // 메소드 안에 필드를 선언할 수 없다. (지역 변수는 public으로 선언될 수 없다)
		
		for (int e=0;e<10;e++) {
			//int a=1;    // main 블록 안에 int a를 두 번 정의할 수 없다.
			System.out.print(e);
		}
	}
}

 

 

 


 

접근자(getter)와 설정자(setter)

  1. 캡슐화에서, private를 주어 내부에 은닉할 정보가 있을 때, 그래도 그 정보에 접근하려면 메서드를 만들어서 접근하도록 하 수 있다.
  2. 접근자 (getter) : private 멤버 변수의 값(은닉된 정보값)을 가져오는 메서드
  3. 설정자 (setter) : private 멤버 변수(은닉된 정보)에 값을 저장하는 메서드
  4. getter 게터 이름 공식
    1. String getModel () {return this.model;}   (get + 변수명)
    2. boolean isComplete() {return this.complete;}   (boolean 타입의 경우 is + 변수명)

 

예시

더보기
------------------------같은 패키지에 Circle.java 파일-------------------------
public class Circle2 {
	private double radius;   // 클래스 내부에서만 쓸 수 있다. 정보 은닉. 캡슐화.
	
	public double getRadius() {   // 은닉된 정보인 radius를 호출하기 위한 메소드. (getter)
		return radius;
	}
	
	public void setRadius(double r) {   // 은닉된 정보인 radius에 저장하기 위한 메솓. (setter)
		this.radius = r;
	}
	
	double findArea() {
		return 3.14 * radius * radius;
	}
	
	void show(double x, double y){
		System.out.printf("반지름 : %.1f, 넓이 : %.1f\n",x,y);
	}
}

----------------------같은 패키지에 CircleDemo.java 파일-----------------------
public class Circle2Demo {
	public static void main(String[] args) {
		Circle2 C2 = new Circle2();
		//C2.radius = 10.0이 불가. private로 선언되어 있으므로 접근할 수 없다
		C2.setRadius(10.0);
		C2.show(C2.getRadius(), C2.findArea());
	}
}
------------------------같은 패키지에 Circle.java 파일-------------------------
public class age {
	public String name = "";
	private int age = 0;
	
	int setAge(int age) {
		if(age<0 || age>100) {
			System.out.println("나이가 잘못 입력되었습니다.");
			return this.age = 0;
		} else {return this.age = age;}
	}
	int getAge(){return this.age;}
	void output() {
		System.out.println("이름 : " + this.name);
		System.out.println("나이 : " + this.age);
		System.out.println("");
	}
}
----------------------같은 패키지에 Main.java 파일-----------------------
public class Main {
	public static void main(String[] args) {
		age person1 = new age();
		person1.name = "개솔";
		// person1.age = 30;   // age는 private이라서 직접 접근할 수 없다.
		person1.setAge(130);
		person1.output();
		
		age person2 = new age();
		person2.name = "개솔이 친구";
		person2.setAge(30);
		System.out.println(person2.name + "의 나이는 " + person2.getAge());
	}
}

 


생성자

생성자 (constructor)

  1. 객체를 생성하는 시점에서 필드에 각기 다른 값을 초기화해주기 위해 사용한다.
  2. 생성자 이름 = 클래스 이름
  3. 생성자는 return 타입이 없다! 그게 메소드와의 차이점. (void 같은 거 쓰면 오류난다)
  4. 생성자를 따로 명시해 줄 거면 반드시 디폴트 생성자도 같이 만들어라. 그래야 나중에 자주 발생할 오류를 미연에 방지할 수 있다! (상속 시에 필요하다)

디폴트 생성자 (Default Constructor)

  1. 매개변수가 없는 생성자.
  2. 생성자를 따로 선언하지 않으면 컴파일러가 자동으로 디폴트 생성자를 만들다.
  3. 생성자를 선언하면 컴파일러가 디폴트 생성자를 만들지 않아서 쓸 수 없다.
  4. 디폴트 생성자도 직접 선언해서 일반 생성자와 같이 쓸 수 있다.

 

기본형

//디폴트 생성자
public Circle () {};   // 디폴트 생성자. 클래스 안에 지정 (없으면 자동 생성)
Circle C1= new Circle();   // 메인 메서드 안에서 필드 값이 초기값인 인스턴스 생성

//생성자
public Circle(double r) {radius = r};   // 생성자. 클래스 안에 지정 
Circle C1 = new Circle(10.0);   // 메인 메서드 안에서 radius = 10.0이 지정된 인스턴스 생성

 

예시

더보기
------------------------같은 패키지에 Circle.java 파일-------------------------
public class Circle3 {
	private double radius;
	
	public Circle3(double r) {  // 생성자.
		radius = r;
	}
}

----------------------같은 패키지에 CircleDemo.java 파일-----------------------
public class Circle3Demo {
	public static void main(String[] args) {
		Circle3 C3 = new Circle3(10.0);
		//Circle3 C4 = new Circle3()  디폴트 생성자가 없으므로 사용할 수 없다.
	}
}

 

this와 연속호출

  1. return이 this면 타입(void)도 클래스 이름.
  2. 연속호출 : 디자인 패턴에서 체인 방식의 패턴.

예시

 

더보기
------------------------같은 패키지에 Person.java 파일-------------------------
public class Person {
	String name;
	int age;
	
	public Person setName(String name) {
		this.name = name;
		return this;
	}
	
	public Person setAge(int age) {
		this.age = age;
		return this;
	}
	
	public void sayHello() {
		System.out.println("안녕, 나는 " + name + "이고, " + age + "이야.");
	}
}

----------------------같은 패키지에 MethodChainDemo.java 파일-----------------------
public class MethodChainDemo {
	public static void main(String[] agrs) {
		Person people = new Person();
		people.setName("민국").setAge(21).sayHello();   // 연속호출
	}
}

 

 


final

특징

  1. final 변수 : 값을 한 번만 저장하고 더이상 수정 불가
  2. final 메소드 : 오버라이드 불가
  3. final 클래스 : 상속 불가

final 클래스 예시

더보기
class Good {}
class Better extends Good {}
final class Best extends Better{}
//class NumberOne extends Best {}   // final은 상속 불가능

public class Ex04Main {
	public static void main(String[] args) {
		//new NumberOne();
		new Best();
	}
}

 


오버로딩 (Overloading)

특징

  1. 매개변수의 개수 또는 타입이 달라도, 같은 이름의 메소드를 사용할 수 있도록 설계한다.
  2. 접근 제어자를 자유롭게 지정할 수 있다 (public, default, protected, private 등)
  3. 흔히 사용하는 println이 다양한 자료형(int, double, String 등)을 출력할 수 있는 것도, println이 오버로딩이기 때문이다. 

사용 이유

  1. 같은 기능을 하는 메소드를 여러 개로 만들지 않고 하나의 이름으로 사용할 수 있다.
  2. 메소드의 이름을 절약할 수 있다.

예시

더보기
class Plus{
	int add(int a, int b) {return a+b;}
	int add(int a) {return a+1;}
	int add() {return 2;}
	double add(double a, double b) {return a+b;}
}

public class Ex03 {
	public static void main(String []agrs) {
		Plus cal = new Plus();
		System.out.println(cal.add());   // 결과 2
		System.out.println(cal.add(2,3));   // 결과 5
		System.out.println(cal.add(2));   // 결과 3
		System.out.println(cal.add(2.0,3.0));   // 결과 5.0
		
	}
}

 

생성자 오버로딩

  1. 같은 클래스에 다양한 매개변수 형태를 담는 것

예시

더보기
------------------------같은 패키지에 Circle.java 파일-------------------------
public class Circle4 {
	double radius;
	String color;
	
	public Circle4 (double radius, String color) {
		this.radius = radius;
		this.color = color;
	}
	
	public Circle4 (double radius) {
		this(radius, "파랑");
	}
	
	public Circle4 (String color) {
		this(10.0, color);
	}
	
	public Circle4 () {
		this(10.0, "빨강");
	}
}

----------------------같은 패키지에 CircleDemo.java 파일-----------------------
public class Circle4Demo {
	public static void main(String[] args) {
		Circle4 C1 = new Circle4(10.0, "빨강");
		Circle4 C2 = new Circle4(5.0);
		Circle4 C3 = new Circle4("노랑");
		Circle4 C4 = new Circle4();		
	}
}
class Book {
	int num = 0;
	int price = 0;
	String name = "";
	
	Book (){
		this.name = "이름 입력";
		this.price = 10000;
	}
	Book (String name, int price){
		this.name = name;
		this.price = price;
	}
	Book (String name){
		this.name = name;
		this.price = 10000;
	}
	void output() {
		System.out.println("책 이름 : " + this.name);
		System.out.println("책 개수 : " + this.num);
		System.out.println("책 가격 : " + this.price);
	}
}

public class Ex03 {
	public static void main (String[] args) {
		Book book1 = new Book();
		book1.output();
		
		Book book2 = new Book("개솔의 아무말 책",30000);
		book2.num = 10;
		book2.output();
		
		Book book3 = new Book("어떤 책");
		book3.num = 1;
		book3.output();
	}
}