======Ch.07 클래스======
=====클래스와 객체=====
package chapter07;
public class MemberMain {
public static void main(String[] args) {
Member m = new Member();
Member m2 = new Member();
if (m == m2) {
System.out.println("m개체와 m2객체는 같다.");
} else {
System.out.println("m개체와 m2객체는 같지 않다.");
}
}
}
package chapter07;
public class MemberMain2 {
public static void main(String[] args) {
MemberMain2 m = new MemberMain2();
MemberMain2 m2 = new MemberMain2();
if (m == m2) {
System.out.println("m개체와 m2객체는 같다.");
} else {
System.out.println("m개체와 m2객체는 같지 않다.");
}
}
}
===== 클래스의 구조=====
package chapter07;
public class Car {
// 필드
String color;
String company;
String type;
// 메서드
public void go() {
System.out.println("전진하다.");
}
public void back() {
System.out.println("후진하다.");
}
}
package chapter07;
public class CarMain {
public static void main(String[] args) {
Car tico = new Car();
Car pride = new Car();
tico.color = "화이트";
tico.company = "대우";
tico.type = "경차";
pride.color = "블랙";
pride.company = "기아";
pride.type = "소형";
tico.go();
pride.go();
System.out.println(tico.color);
System.out.println(tico.company);
System.out.println(tico.type);
System.out.println(pride.color);
System.out.println(pride.company);
System.out.println(pride.type);
}
}
**객체를 배열에 저장.**
배열은 같은 자료형의 값을 담을 수 있기에 Car타입의 배열을 선언하면 여러 개의 Car 객체이 가능하다. 객체 역시 참조 자료형이기에 메모리 주소값을 참조한다.
package chapter07;
public class CarMain2 {
public static void main(String[] args) {
// Car 타입의 배열객체 생성
Car[] cars = new Car[3];
// 모든 인덱스에 new 연산자로 객체 생성 후 저장
for (int i=0; i
=====필드=====
package chapter07;
public class VarEx {
public static void main(String[] args) {
// 클래스 변수 사용
System.out.println("Avante 제조사 : "+Avante.company);
Avante a1 = new Avante();
Avante a2 = new Avante();
// 인스턴스 변수의 값 변경
a1.color = "화이트";
a2.color = "블랙";
// 인스턴스 변수 출력
System.out.println("a1 색상 : "+a1.color);
System.out.println("a2 색상 : "+a2.color);
// 클래스 변수를 인스턴스 객체로 출력
System.out.println("a1 제조사 : "+a1.company);
System.out.println("a2 제조사 : "+a2.company);
// 클래스 변수의 값 변경
a1.company = "기아";
// 클래스 변수의 값 변경 후 클래스변수와 인스턴스변수 출력
System.out.println("Avante 제조사 : "+Avante.company);
System.out.println("a1 제조사 : "+a1.company);
System.out.println("a2 제조사 : "+a2.company);
}
}
class Avante {
static String company = "현대"; // 클래스 변수
String color; // 인스턴스 변수
}
**변수의 범위**
package chapter07;
public class LocalValEx {
public static void main(String[] args) {
Local local = new Local();
System.out.println(local.name); // null
local.process();
System.out.println(local.name); // 홍길동
local.printAge1();
local.printAge2();
// for문 블록 내에서의 변수 선언
for (int i=0; i<10; i++) {
int temp = 0;
temp += i;
}
//System.out.println(temp); // 에러
}
}
class Local {
String name;
void process() {
name = "홍길동";
}
void printAge1() {
int age = 20; // 지역변수
System.out.println(age);
}
void printAge2() {
int age = 30; // 지역변수
System.out.println(age);
}
}
=====메서드=====
**매개 변수 선언**
package chapter07;
public class ParamEx {
public static void main(String[] args) {
Param p = new Param();
p.add(10,5);
//p.add("10", "5"); //에러
p.add2(10, 5);
}
}
class Param {
void add(int x, int y) {
int z = x + y;
System.out.println(z);
}
void add2(double x, double y) {
double z = x + y;
System.out.println(z);
}
}
**리턴값**
package chapter07;
public class ReturnEx {
public static void main(String[] args) {
Return obj = new Return();
String name = obj.getName();
int age = obj.getAge();
System.out.println(name);
System.out.println(age);
System.out.println(obj.getName());
System.out.println(obj.getAge());
}
}
class Return {
String getName() {
return "홍길동";
}
int getAge() {
return 30;
}
}
**return문으로 메서드를 중지**
**return문은 두 개 이상 쓸 수 없다.**
package chapter07;
public class ReturnEx2 {
public static void main(String[] args) {
Return2 obj = new Return2();
obj.getTest(0);
obj.getTest(1);
System.out.println(obj.getName(0));
System.out.println(obj.getName(1));
}
}
class Return2 {
void getTest(int type) {
System.out.println("getTest() 메서드 시작");
if (type == 1) {
return;
}
System.out.println("getTest() 메서드 끝");
}
String getName(int type) {
if (type == 1) {
return "";
}
return "홍길동";
}
String getAge(int type) {
return "";
//return "홍길동"; // 에러발생
}
}
**메서드의 실행(호출)**
package chapter07;
public class MethodCall {
public static void main(String[] args) {
// 직접 실행
Method.printName();
// 객체를 생성해서 실행
Method m = new Method();
m.printEmail();
}
}
class Method {
static void printName() {
System.out.println("printName() 실행");
}
void printEmail() {
System.out.println("printEmail() 실행");
printId(); // 다른 메서드 실행
}
void printId() {
System.out.println("printId() 실행");
}
}
**메서드의 실행순서**
Stack형 자료구조 - 가장 나중에 들어온 데이터가 가장 먼저 출력되는 자료구조
package chapter07;
public class MethodOrder {
public static void main(String[] args) {
MethodEx me = new MethodEx();
me.one(); // 메서드 실행
}
}
class MethodEx {
void one() { // 1.
two();
System.out.println("one");
}
void two() { // 2.
three();
System.out.println("two");
}
void three() { // 3.
System.out.println("three");
}
}
**메서드의 중첩**
package chapter07;
public class MethodEx2 {
public static void main(String[] args) {
System.out.println(divide(pow(add(3,3))));
}
static int add(int x, int y) {
return x + y;
}
static int pow(int x) {
return x * x;
}
static int divide(int x) {
return x / 2;
}
}
**메서드 오버로딩**
클래스 내에 같은 이름의 메서드를 여러개 생성하는 것. 매개변수를 다양하게 입력 받기 위해 존재하며, 매개변수의 자료형, 개수, 순서 중에 하나 이상은 다르게 입력되어야 한다.
package chapter07;
public class Overloading {
public static void main(String[] args) {
Operator op = new Operator();
System.out.println(op.multiply(4, 3));
System.out.println(op.multiply(4.5, 3.5));
System.out.println(op.multiply(4, 3.5));
System.out.println(op.multiply(4.5, 3));
}
}
class Operator {
int multiply(int x, int y) {
System.out.println("(int, int)");
return x * y;
}
double multiply(double x, double y) {
System.out.println("(double, double)");
return x * y;
}
double multiply(int x, double y) {
System.out.println("(int, double)");
return x * y;
}
double multiply(double x, int y) {
System.out.println("(double, int)");
return x * y;
}
}
package chapter07;
public class Overloading2 {
public static void main(String[] args) {
System.out.println(1);
System.out.println(5.5);
System.out.println((long)100);
System.out.println("홍길동");
System.out.println('a');
System.out.println(true);
System.out.println(new Overloading2());
System.out.println(new int[5]);
}
}
package chapter07;
public class Overloading2 {
public static void main(String[] args) {
System.out.println(1);
System.out.println(5.5);
System.out.println((long)100);
System.out.println("홍길동");
System.out.println('a');
System.out.println(true);
System.out.println(new Overloading2());
System.out.println(new int[5]);
}
}
=====생성자=====
**- 객체의 초기화를 위해 존재한다.**
**형태**
Member member = new Member();
**변수 초기화**
**에러 발생**
**Student(String name, int grade, String department)생성자가 정의되면 Student()생성자는 사용할 수 없으므로 직접 정의해 주어야 함.**
**생성자 오버로딩**
package chapter07;
public class Student {
// 필드
String name; // 학생명
int grade; // 학년
String department; // 학과
// 1번 생성자
Student() {
}
// 2번 생성자
Student(String n) {
name = n;
}
// 3번 생성자
Student(String n, int g) {
name = n;
grade = g;
}
// 4번 생성자
Student(String n, int g, String d) {
name = n;
grade = g;
department = d;
}
// 학과와 학년을 매개변수로 받는 생성자 (에러 발생)
// Student(String d, int g) {
// department = d;
// grade = g;
// }
}
새로운 객체 추가
package chapter07;
public class StudentMain {
public static void main(String[] args) {
Student stu1 = new Student(); // 1번 생성자
Student stu2 = new Student("홍길동"); // 2번 생성자
Student stu3 = new Student("홍길동", 4); // 3번 생성자
Student stu4 = new Student("홍길동", 4, "소프트웨어공학");
}
}
=====this 생성자=====
**객체자신**
package chapter07;
public class Car2 {
// 필드
String color;
String company;
String type;
Car2() {
this("white", "기아", "경차");
}
Car2(String color, String company, String type) {
this.color = color;
this.company = company;
this.type = type;
}
Car2(String com, String t) {
this("white", com, t);
}
Car2(String t) {
this("white", "기아", t);
}
public String toString() {
return color + "-" + company + "-" + type;
}
}
package chapter07;
public class Car2Main {
public static void main(String[] args) {
Car2 c1 = new Car2();
Car2 c2 = new Car2("중형차");
Car2 c3 = new Car2("현대", "대형차");
Car2 c4 = new Car2("black", "기아", "화물차");
System.out.println("c1 = "+c1);
System.out.println("c2 = "+c2);
System.out.println("c3 = "+c3);
System.out.println("c4 = "+c4);
}
}
===== 초기화 블록=====
package chapter07;
public class InitEx {
// 생성자
InitEx() {
System.out.println("생성자 호출");
}
//static 초기화블럭
static {
System.out.println("클래스 초기화 블럭 실행");
}
// 인스턴스 초기화 블럭
{
System.out.println("인스턴스 초기화 블럭 실행");
}
public static void main(String[] args) {
System.out.println("main 메서드시작");
System.out.println("main init1 객체 생성");
InitEx init1 = new InitEx();
System.out.println("main init2 객체 생성");
InitEx init2 = new InitEx();
}
}
package chapter07;
public class InitEx2 {
// static 변수
static int sVar;
// static 메서드
static void sMethod() {
}
// 인스턴스 변수
int var;
// 인스턴스 메서드
void method() {
}
//static 초기화블럭
static {
sVar = 0; // static 변수
sMethod(); // static 메서드
// 에러
//var = 0; // 인스턴스 변수
//method(); // 인스턴스 메서드
}
// static 메서드
static void sMethod2() {
// 에러
//this.sVar = 0; // static 변수
//this.sMethod(); // static 메서드
}
}
=====패키지=====
package chapter07.test;
public class TestPackage {
public void method() {
System.out.println("chapter.test 패키지의 TestPackage 클래스");
}
}
package chapter07;
public class PackageEx {
public static void main(String[] args) {
chapter07.test.TestPackage test = new chapter07.test.TestPackage();
test.method();
}
}
package chapter07;
import chapter07.test.TestPackage;
public class PackageEx2 {
public static void main(String[] args) {
TestPackage test = new TestPackage();
test.method();
}
}
import chapter07.test.TestPackage;
import chapter07.test.TestPackage2;
import chapter07.test.*; //해당패키지의 모든 클래스를 import
import chapter07.*; // chapter07 패키지 안에 있는 모든 클래스 사용, test 패키지는 미포함
=====접근 제한자=====
package chapter07.test;
public class ClassA {
public static void main(String[] args) {
ClassB cb = new ClassB();
cb.print();
}
public void print() {
System.out.println("여기는 ClassA");
}
}
class ClassB {
void print() {
System.out.println("여기는 ClassB");
}
}
package chapter07.test.test2;
import chapter07.test.*;
public class ClassC {
public static void main(String[] args) {
ClassA ca = new ClassA();
ca.print();
//ClassB cb = new ClassB(); // 접근제한자 때문에 에러
}
}
=====싱글톤=====
package chapter07;
public class Singleton {
// static 변수
private static Singleton instance = new Singleton();
// 생성자에 private 접근 제한자
private Singleton() {
System.out.println("객체 생성");
}
// static 메서드
public static Singleton getInstance() {
System.out.println("객체 리턴");
return instance;
}
}
package chapter07;
public class SingletonMain {
public static void main(String[] args) {
//Singleton s = new Singleton(); // 에러 발생
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
Singleton s3 = Singleton.getInstance();
}
}
=====final=====
**final 변수, 상수**
package chapter07;
public class FinalEx {
public static void main(String[] args) {
Final f = new Final();
//f.number = 200; // 에러
}
}
class Final {
final int number;
Final() {
number = 100;
}
}
**상수(static final)**
package chapter07;
public class ConstantEx {
static final double CARD_COMMISSION = 1.5;
public static void main(String[] args) {
System.out.println("원주율 : "+Math.PI);
System.out.println("카드 수수료율 : "+CARD_COMMISSION);
// CARD_COMMISSION = 1.8; // 에러
}
}