위로
아래
클래스
기본형
//class 이름 : Circle
//참조변수 이름 : C1
//클래스 선언 파일
class Circle {
// 필드 (객체의 속성)
// 메서드 (객체의 동작)
}
//메인 메소드 파일
1. 정석형
Circle C1;
C1 = new Circle();
2. 축약형
Circle C1 = new Circle();
3. 변수 생략형 (객체를 두 번 이상 참조하지 않을 때)
new Circle();
- 참조변수는 stack 영역에 저장되어, 힙 영역에 있는 동적 객체의 주소를 가리키는 정적 데이터다.
- 클래스는 다른 패키지에서 import로 불러올 수 있다.
- 클래스는 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 ( 데이터 입력)하면 메인 함수에 문자열 데이터를 넣는다.
특징
- Java는 어플리케이션이 실행되면 메인 메소드부터 제일 먼저 실행한다.
- 가장 먼저 실행하기 때문에 메인 메소드를 따로 호출할 수는 없다.
- 파일 이름은 이 클래스 이름으로 지정해야 한다.
필드와 지역변수
필드
- 초기화 안 해도 0 또는 null의 기본값이 들어간다
- 클래스 전체에서 사용할 수 있다. (어디에서 선언해도 상관 없다)
- 모든 접근 지정자뿐만 아니라 static, final로 지정할 수 있다.
지역변수
- 초기화 안 하면 기본값이 없어서 오류난다
- 선언된 후부터 선언된 블럭까지만 사용할 수 있다.
- 접근 지정자, 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)
- 캡슐화에서, private를 주어 내부에 은닉할 정보가 있을 때, 그래도 그 정보에 접근하려면 메서드를 만들어서 접근하도록 하 수 있다.
- 접근자 (getter) : private 멤버 변수의 값(은닉된 정보값)을 가져오는 메서드
- 설정자 (setter) : private 멤버 변수(은닉된 정보)에 값을 저장하는 메서드
- getter 게터 이름 공식
- String getModel () {return this.model;} (get + 변수명)
- 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)
- 객체를 생성하는 시점에서 필드에 각기 다른 값을 초기화해주기 위해 사용한다.
- 생성자 이름 = 클래스 이름
- 생성자는 return 타입이 없다! 그게 메소드와의 차이점. (void 같은 거 쓰면 오류난다)
- 생성자를 따로 명시해 줄 거면 반드시 디폴트 생성자도 같이 만들어라. 그래야 나중에 자주 발생할 오류를 미연에 방지할 수 있다! (상속 시에 필요하다)
디폴트 생성자 (Default Constructor)
- 매개변수가 없는 생성자.
- 생성자를 따로 선언하지 않으면 컴파일러가 자동으로 디폴트 생성자를 만들다.
- 생성자를 선언하면 컴파일러가 디폴트 생성자를 만들지 않아서 쓸 수 없다.
- 디폴트 생성자도 직접 선언해서 일반 생성자와 같이 쓸 수 있다.
기본형
//디폴트 생성자
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와 연속호출
- return이 this면 타입(void)도 클래스 이름.
- 연속호출 : 디자인 패턴에서 체인 방식의 패턴.
예시
더보기
------------------------같은 패키지에 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
특징
- final 변수 : 값을 한 번만 저장하고 더이상 수정 불가
- final 메소드 : 오버라이드 불가
- 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)
특징
- 매개변수의 개수 또는 타입이 달라도, 같은 이름의 메소드를 사용할 수 있도록 설계한다.
- 접근 제어자를 자유롭게 지정할 수 있다 (public, default, protected, private 등)
- 흔히 사용하는 println이 다양한 자료형(int, double, String 등)을 출력할 수 있는 것도, println이 오버로딩이기 때문이다.
사용 이유
- 같은 기능을 하는 메소드를 여러 개로 만들지 않고 하나의 이름으로 사용할 수 있다.
- 메소드의 이름을 절약할 수 있다.
예시
더보기
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
}
}
생성자 오버로딩
- 같은 클래스에 다양한 매개변수 형태를 담는 것
예시
더보기
------------------------같은 패키지에 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();
}
}