본문 바로가기

자바/객체지향

객체지향을 위한 첫걸음 class 클래스

예제1)


public class Test1 {

public static void main(String[] args) {

// 객체생성(인스턴스 생성)

Rect ob1=new Rect();

Rect ob2=new Rect();


int a,b;


ob1.width=10;    // 직접 인스턴스변수 적용(속성 변화)

ob1.height=5;


a=ob1.area();    // 인스턴스를 이용한 변수 적용(속성 변화)

b=ob1.len();


ob1.print(a,b);    // 메서드 호출(기능 실행)


a=ob2.area();

b=ob2.len();

ob2.print(a,b);

}

}


/*

사각형의 넓이와 둘레 계산하는 클래스 작성

1. 추상화

상태(데이터) : 가로,세로

행동(메소드) : 넓이계산,둘레계산,출력

2. 클래스작성

3. 객체생성

*/


class Rect {  //디폴트 접근제어

int width, height; // 데이터(인스턴스변수) -> 참조변수가 가리키고 있는 변수를 인스턴스변수라 한다.

int area() { // 행위(메소드)

return width*height;

}

int len(){

return(width+height)*2;

}

void print(int a, int b){

System.out.println("가로:"+width);

System.out.println("세로:"+height);

System.out.println("넓이:"+a);

System.out.println("둘레:"+b);

}

}


예제1 결과)


가로:10

세로:5

넓이:50

둘레:30

가로:0

세로:0

넓이:0

둘레:0



==========================================================================================


예제2_1)


public class Test2 {

public static void main(String[] args){

//객체 생성

//클래스명 객체명 =new 생성자();

//생성자의 역활 : 메모리할당(가장 중요),초기화

Rect2 ob=new Rect2();


// ob.width=10; // 컴파일오류. private는 외부접근 불가. 해당 클래스안에서만 수정가능.


//void 메소드 호출

ob.set(10,20);


//int형 메소드 호출

int a=ob.area();

int b=ob.len();


//인자가 2개인 메소드 호출

ob.print(a, b);

}

}


예제2_2)


/*

class 접근제어 : 디폴트,public.protected,

private(클래스 내부에서만 사용가능)

*/

public class Rect2 {

/*

  변수,메소드 접근제어 : 디폴트, public,protected,private

디폴트:아무것도 붙이지 않은 상태(예; Test1.java)

동일한 패키지(폴더)내에서만 접근가능

즉, 동일한 폴더내의 클래스에서 접근 가능

public : 외부어디에서나 접근가능

protected : 동일패키지, 하위클래스에서만 접근가능

private : 외부에서는 접근 불가능(캡슐화).계좌의 잔액에 접근못하게하는 것처럼.

*/


//인스턴스 변수(프로퍼티) -> 초기화하지 않으면 숫자변수는 0(메소드 안의 변수는 초기화를 꼭해줘야하는 것이랑 다르다)

private int width, height;


//메소드:일을 하는 가장 작은 단위

//[접근제어] 리턴타입 메소드명([인수...])

public void set(int w, int h){  // void는 일만 하고 끝난다

width=w;

height=h;


return; //void인 경우만 생략가능

}


public int area(){

return width*height;

}


public int len(){  // void가 아닌경우에는 return을 쓰는데 이아이는 일을하고 자료형값을 넘겨준다.

return(width+height)*2;

}


public void print(int a, int b){

System.out.println("가로:"+width);

System.out.println("세로:"+height);

System.out.println("넓이:"+a);

System.out.println("둘레:"+b);

}

}


예제2 결과) 예제2_2를 컴파일 할 필요없이 예제2_1을 컴파일하면 자동으로 예제2_2가 컴파일된다. 실행 역시 예제2_1만 해주면된다.


가로:10

세로:20

넓이:200

둘레:60


==========================================================================================


예제3) 로또


import java.io.IOException;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.util.Random;

import java.util.Arrays;

public class Test3 {

public static void main(String[] args) throws IOException {

char ch;

Lotto ob=new Lotto();


while (true){

do{

System.out.print("1.구매 2.종료 ==>");

ch=(char)System.in.read();

System.in.skip(2);

}while (ch<'1' || ch>'2');

switch(ch){

case'1':ob.gameStart();break;

case'2':return;

}

}

}

}

// 위의 메인은 아주 짧다. 보통 이런식이다. 대부분의 소스는 다른 클래스에서 짠다.


class Lotto{

private int[] num=new int[6];

private int count;

public void gameStart() throws IOException {

BufferedReader br=new BufferedReader(

new InputStreamReader(System.in));

do{

System.out.print("구매 갯수?");

count=Integer.parseInt(br.readLine());

}while (count<1 || count>5);


for(int i=1; i<=count; i++) {

lottoNum();

print(i); 

}

}


private void lottoNum() {

Random rd=new Random();

for(int i=0; i<6; i++) {

num[i] = rd.nextInt(45)+1;

for(int j=0; j<i; j++) {

if(num[i]==num[j]) {

i--;

break;

}

}

}


//정렬

Arrays.sort(num);

}


private void print(int n){

System.out.print(n+"번째 : ");

for(int i=0; i<num.length; i++)

System.out.printf("%4d", num[i]);

System.out.println();

}

}


예제3 결과)



==========================================================================================


예제4)


 public class Test4{

public static void main(String[] args) {

//컴파일 오류. 인스턴스변수, 인스턴스메소드는 객체 생성(메모리할당)이 된 후에 접근할 수 있다.

//Bank.neme="홀길동";


//객체생성

Bank mm=new Bank();

mm.name="홀길동"; // 디폴트 접근제어라 가능하다.

//mm.money=200; // 컴파일오류. private외부 접근불가


int m=mm.draw(50);

if(m==-1)

System.out.println("인출실패 !!!");

else

System.out.println("인출성공 !!!");

System.out.println("남은돈:"+mm.getMoney());


Bank oo=new Bank();

System.out.println("이름:"+oo.name);

System.out.println("남은돈:"+oo.getMoney());

}

}


class Bank{

//인스턴스변수. private : 외부접근불가

private int money=100; // 선언과 동시에 초기화

 // 정수형 변수는 초기화히자 않으면 0

// System.out.println("테스트"); //컴파일오류. 선언부에는 실행문이 올 수 없다.


//인스턴스변수. 동일패키지 접근가능

// 레퍼런스변수(클래스형 변수, 배열 등)은 초기화하지 않으면 null로 초기화

String name;


//인스턴스 메소드

public int getMoney() {

return money;

}


public int draw(int m){

if(m>money)

return -1;


money-=m;


return m;

}


//저금

public void saving(int m) {

money+=m;

}

}


예제4 결과)


인출성공 !!!

남은동:50

이름:null

남은돈:100


==========================================================================================


예제5)


public class Test5{

private int  num;


//인스턴스메소드

//인스턴스메소드는 객체를 생성(메모리할당)을 해야 사용가능

public int sum() {

int s=0;

for(int i=1; i<=num; i++){

s+=i;

}

return s;

}

public void print(int s) {

System.out.println("1~"+num+"까지 합 :"+s);

}


//클래스메소드.

//클래스메소드는 클래스가 메모리에 로딩된순간 메모리 할당.

public static void main(String[] args) {

//클래스메소드에서는 인스턴스 변수나 인스턴스 메소드를 바로 접근불가. -> 메모리할당이 않되었으기 때문에.

//num=100; //컴파일 오류


//객체 생성 : 인스턴스변수, 인스턴스메소드 메모리 할당

//  언제메모리 제거가 될까? 가비지셀렉터가 알아서 종료.

Test5 oo=new Test5();

oo.num=100;

int s=oo.sum();

oo.print(s);

}

}


예제5 결과)


1~100까지 합 :5050


==========================================================================================


예제6)


public class Test6{

//클랙스 메소드. 클래스 로딩시 메모리 할당.

// 그럼 메모리에서 제거는? 프로그램 종료시 제거 -> 아무대나 static 붙이지 않아야 한다.

public static int sum(int n) {

int s=0;

for(int i=1; i<=n; i++)

s+=1;


return s;

}


public static void main(String[] args) {

int ss;

// 일반적으로 클래스메소드는 클래스명.메소드명() 식으로 부름(동일클래스내에서만 '클래스명.'을 생략 할 수 있음. 

ss=sum(100); // ss=Test6.sum(100);


System.out.println("합 :" + ss);

}

}


예제6 결과)


합 :100


==========================================================================================


예제7)


public class Test7 {

public static void main(String[] args) {

Rect7 ob=new Rect7();


ob.set(10);

double a=ob.area();

double b=ob.len();

ob.print(a,b);

}

}


/*

원의 넓이와 둘레를 구하는 클래스 만들기

데이터 : 반지름

메소드 : 넓이 구하기, 둘레구하기, 출력하기

한번 만들어보삼

*/


class Rect7 { 

private int r;

public void set(int rr){

r=rr;

}

public double area(){

return r*r*3.14f;

}

public double len(){

return r*2*3.14f;

}

public void print(double a, double b){

System.out.println("반지름:"+r);

System.out.println("넓이:"+a);

System.out.println("둘레:"+b);

}

}


예제7 결과)


반지름:10

넓이:314.0

둘레:62.80000305175781


==========================================================================================


예제8)


/*

생성자 : 메모리할당, 초기화

- 생성자는 일반 메소드 처럼 호출될 수 없으며 객체를 생성할 때

  클래스 객체 = new 생성자(); 식으로 부름

- 생성자는 클래스와 동일한 이름을 가져야 하며 인자를 가질 수 있다.

- 생성자는 중복정의가 가능하다.

- 생성자는 리턴타입이 존재하지 않는다.

- 생성자를 작성하지 않으면 디폴트 생성자가 컴파일시 만들어진다. 

  디폴트생성자는 아무런 코드가 없는 빈상태의 생성자이며 생성자가 존재하면 만들지 않는다.

*/



public class Test8 {

public static void main(String[] args){

//객체생성(인스턴스 메모리할당)

Ex1 oo = new Ex1();

oo.set(10);

oo.print();


Ex2 bb=new Ex2();

bb.print();


//Ex3 cc=new Ex3(); // 오류. 인자가 없는 생성자가 없다.

Ex3 cc = new Ex3(50);

cc.print();


Ex4 e1=new Ex4();

e1.print();

Ex4 e2=new Ex4(30);

e2.print();



}

}


/*

생성자가 없으면 컴파일시 다음과 같이 디폴트 생성자가 만들어짐

public Ex1(){}

*/

class Ex1{

private int a;

public void set(int aa) {

a=aa;

}

public void print(){

System.out.println("a:"+a);

}

}


class Ex2{

private int a;

public Ex2(){ // 생성자.클래스명과 동일하고 리턴타입이 없어야함.

a=100; // 초기화

}

public void set(int aa) {

a=aa;

}

public void print(){

System.out.println("a:"+a);

}

}


class Ex3{

private int a;

// 인자가 있는 생성자

public Ex3(int aa){ 

a=aa;

}

public void set(int aa) {

a=aa;

}

public void print(){

System.out.println("a:"+a);

}

}


class Ex4{

private int a;

// 인자가 없는 생성자

public Ex4(){

}

// 인자가 있는 생성자

public Ex4(int aa){ 

a=aa;

}

public void set(int aa) {

a=aa;

}

public void print(){

System.out.println("a:"+a);

}

}


예제8 결과)


a:10

a:100

a:50

a:0

a:30


==========================================================================================


예제9)


public class Test9{

public static void main(String[] args){

/*

생성자 호출 순서

1.인스턴스변수메모리  할당

2.초기화블럭실행

3.생성자 몸체 실행

*/

Demo9 ob=new Demo9();

ob.print();

}

}


class Demo9{

private int a; // 초기값 : 0

private int b= 10; // 초기화

private int c;


{ // 초기화 블럭

a=20;

System.out.println("초기화블럭......");

}

// System.out.println("이건 오류........"); //에러


public void print(){

System.out.println("a:"+a);

System.out.println("b:"+b);

System.out.println("c:"+c);

}

}


예제9 결과)


초기화블럭......

a:20

b:10

c:0


'자바 > 객체지향' 카테고리의 다른 글

static 키워드  (0) 2013.05.21
업캐스팅 다운캐스팅  (0) 2013.05.19
재정의(override), 중복정의(overloading)  (0) 2013.05.19
자바의 상속  (0) 2013.05.19
Method 메서드  (0) 2013.05.14