19일차_상속

JavaSE 2015. 6. 21. 07:15

------------------------------
상속 (Inheritance)


7. 하위 클래스는 한 개만의 상위 클래스를 선택할 수 있다. 단일 상속. 상위 클래스는 파생을 염두해두고 자신의 멤버를 상속 가능한 상태로 만드는 것이 일반적이다. 하위 클래스는 모든 상위 클래스를 스스로 선택할 수 있다. 상위 클래스는 하위 클래스가 가지게 될 공통적인 특성만 멤버로 구성하는 경우가 많다. 하위 클래스는 개별적인 특성을 구성하게 된다.

 

8. 상위 클래스의 멤버와 같은 이름을 가진 멤버를 하위 클래스에 재구성해서 사용할 수 있다. 오버라이딩(Overriding).

오버라이딩 기본 조건
- 상위 클래스의 멤버와 동일한 이름, 메소드 시그니처, 리턴타입을 가진 메소드
- 접근지정자는 상위 클래스와 다르게 지정할 수 있다. 단, 상위 클래스보다 좁은 범위로의 지정은 안된다.
- 더 적은 예외를 지정할 수 없다.
- static, instance 상태를 변경할 수 없다.


//Super01.java
package com.test;

//최상위 클래스 -> Object
//상위 클래스 역할
public class Super01 {

 //상위 클래스의 멤버 추가
 public void method() {
  System.out.println("Super01 클래스의 method() 호출!");
 }
 
 //Object 클래스의 멤버를 오버라이딩 가능
 //-> toString()
 
 
}

 

 

//Sub01.java
package com.test;

public class Sub01 extends Super01 {
 
 //Sub01 클래스의 고유 멤버 추가
 public void method2() {
  System.out.println("Sub01 클래스의 method2() 호출!");
 }
 
 //Super01 클래스의 멤버(method() 메소드) 오버라이딩
 //Super01 클래스의 멤버 구성을 동일하게 작성.
 /*@Override는 오버라이딩되는 메소드임을 표시하는 주석*/ 
 @Override
 public void method() {
  //메소드 내부 내용은 새로 지정합니다.
  System.out.println("Sub01 클래스의 method() 호출!");
 }
 
 //Object 클래스의 멤버를 오버라이딩 가능
 //-> toString()
 //-> 인스턴스의 정보 반환
 //-> 패키지.클래스@해쉬코드
 @Override
 public String toString() {
  //메소드 내부 내용은 새로 지정합니다.
  return "Sub01 클래스의 toString() 호출!";
 }
 
}

 

//Sub02.java
package com.test;

public class Sub02 extends Sub01 {

 //멤버가 없는 상태
 //-> Object, Super01, Sub01 클래스의 멤버 공유 가능
 
}

 

 

//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {
  
  Super01 super01 = new Super01();
  super01.method();
  System.out.println(super01.toString());
  
  Sub01 sub01 = new Sub01();
  sub01.method2();
  //오버라이딩 메소드 호출
  sub01.method();
  //오버라이딩 메소드 호출
  System.out.println(sub01.toString());
  
  Sub02 sub02 = new Sub02();
  System.out.println(sub02.toString());
  sub02.method(10);
  
  String str = new String("TEST");
  //오버라이딩 메소드 호출
  System.out.println(str.toString());
  
  Integer a = new Integer(10);
  //오버라이딩 메소드 호출
  System.out.println(a.toString());

  Sub02 b = new Sub02();
  Sub02 c = new Sub02();
  System.out.println(b.equals(c)); //false
 
  Sub02 d = b;
  System.out.println(b.equals(d)); //true
  
  String e = new String("TEST");
  String f = new String("TEST");
  //오버라이딩 메소드 호출
  System.out.println(e.equals(f)); //true
  
  Integer g = new Integer(10);
  Integer h = new Integer(10);
  //오버라이딩 메소드 호출
  System.out.println(g.equals(h)); //true
  
  
 }

}

 

 


--------------------------
객체의 크기 비교


//기본 자료형, 문자열 자료형, 사용자 정의 클래스 자료형 크기 비교

//Sample100.java
package com.test;

public class Sample100 {

 public static void main(String[] args) {
  
  //기본자료형의 자료는 비교 연산자로 크기 비교 가능
  //-> >, <, >=, <=, ==, !=
  
  int a = 10;
  int b = 20;
  System.out.println(a>b); //false
  System.out.println(a<b); //true
  System.out.println(a==b); //false
  System.out.println(a!=b); //true

  //Wrapper Class는 내부적으로 암시적 형변환 지원
  Integer c = new Integer(10);
  Integer d = new Integer(20);
  System.out.println(c>d); //암시적 형변환. Integer->int
  System.out.println(c<d); //암시적 형변환. Integer->int
  
  //참조자료형의 자료는 비교 연산자로 크기 비교 불가능.
  String g = new String("A");
  String h = new String("B");
  //System.out.println(g>h); //X
  //System.out.println(g<h); //X
  //compareTo() 메소드는 문자열 비교시 사용하는 메소드
  //결과값은 0(문자열이 동일한 경우), 음수(-1), 양수(1)
  System.out.println(g.compareTo(h));  //-1 -> g<h
  System.out.println(h.compareTo(g));  //1  -> g<h
  
  String[] result = {"h가 큽니다", "같습니다", "g가 큽니다."};
  System.out.println(result[g.compareTo(h)+1]);
  
  //사용자 정의 클래스에 대한 객체의 크기 비교
  //객체는 크기 비교 불가능
  //동일 자료형을 가진 객체 내부에 있는 데이터 값을 가지고 비교 가능
  //-> compareTo() 메소드 구현 필요
  UserInteger e = new UserInteger(30);
  UserInteger f = new UserInteger(20);
  //System.out.println(e>f);  //X
  //System.out.println(e<f);  //X
  if (e.compareTo(f) == 0) {
   System.out.println("같습니다.");
  } else if (e.compareTo(f) > 0) {
   System.out.println("e가 큽니다.");
  } else {
   System.out.println("f가 큽니다.");
  }
  
 }

}

 


//UserInteger.java
package com.test;

public class UserInteger {
 
 private int a;
 
 //기본생성자 생략
 //매개변수가 있는 생성자만 작성
 public UserInteger(int a) {
  this.a = a;
 }

 public int getA() {
  return this.a;
 }
 
 
 //객체에 전달된 데이터를 비교하는 전용 메소드 추가
 //->compareTo()
 //->결과는 0, 양수, 음수가 나오도록 작성
 public int compareTo(UserInteger obj) {
  //0(동일), 음수(작다), 양수(크다)
  return this.a - obj.getA();
 }
 
 
}

 

--------------------------------------------------

//Member.java
package com.test;

public class Member {
 
 private String name, tel;

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public String getTel() {
  return tel;
 }

 public void setTel(String tel) {
  this.tel = tel;
 }
 

}

 

 

//MemberMain.java
package com.test;

import java.util.*;

public class MemberMain {

 public static void main(String[] args) {
  
  Member[] members = new Member[5];
  
  Member member0 = new Member();
  member0.setName("kim");
  member0.setTel("010-123-1234");
  members[0] = member0;

  Member member1 = new Member();
  member1.setName("choi");
  member1.setTel("010-432-4321");
  members[1] = member1;

  Member member2 = new Member();
  member2.setName("park");
  member2.setTel("010-567-5678");
  members[2] = member2;

  Member member3 = new Member();
  member3.setName("kang");
  member3.setTel("010-543-5678");
  members[3] = member3;

  Member member4 = new Member();
  member4.setName("hong");
  member4.setTel("010-987-9876");
  members[4] = member4;
  
  //정렬 전
  System.out.println("정렬 전:");
  for (Member member : members) {
   //System.out.println(member);
   //System.out.println(member.toString());
   System.out.printf("%s %s %n"
     , member.getName()
     , member.getTel());
  }
  
  
  //배열 요소 정렬 과정 추가
  //객체의 멤버(값)을 기준으로 정렬하는 과정 -> Comparator 구현 필요
  Arrays.sort(members, new Comparator<Member>() {

   //객체의 값 비교하는 메소드에 대해서
   //오버라이딩
   //-> 결과값 0, 양수, 음수
   @Override
   public int compare(Member o1, Member o2) {
    //객체의 값(name)을 비교하는 과정 추가
    //멤버 name-> String -> compareTo() 메소드
    return o1.getName().compareTo(o2.getName());
   }
   
  });

  //정렬 후 (이름 오름차순)
  System.out.println("정렬 후:");
  for (Member member : members) {
   System.out.printf("%s %s %n"
     , member.getName()
     , member.getTel());
  }
 
 
 }

}

 


---------------------------------------------
과제) Student 클래스 작성.
Student 클래스의 멤버 구성은 name, kor, eng, mat, tot로 만든다.
Student 클래스의 객체 여러개를 생성해서
Students 배열에 저장한다.
Student 객체의 멤버변수에 값(name, kor, eng, mat)을
입력하는 과정은 생성자를 이용한다. (setter 이용 가능)
tot(총점) 기준으로 정렬 전 상태와 정렬 후 상태를 출력한다.

실행 예)
입력 범위(2~n)?3
학생1(name kor eng mat)?kim 100 90 80
학생2(name kor eng mat)?choi 100 100 100
학생3(name kor eng mat)?park 70 90 100

정렬 전:
kim 100 90 80 270
choi 100 100 100 300
park 70 90 100 260

정렬 후:
choi 100 100 100 300
kim 100 90 80 270
park 70 90 100 260

 


//Student.java
package com.test;

public class Student {
 
 //이름, 국어, 영어, 수학
 private String name;
 private int kor, eng, mat;

 public Student() {
 }

 public Student(String name, int kor, int eng, int mat) {
  this.name = name;
  this.kor = kor;
  this.eng = eng;
  this.mat = mat;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public int getKor() {
  return kor;
 }

 public void setKor(int kor) {
  this.kor = kor;
 }

 public int getEng() {
  return eng;
 }

 public void setEng(int eng) {
  this.eng = eng;
 }

 public int getMat() {
  return mat;
 }

 public void setMat(int mat) {
  this.mat = mat;
 }

 //총점 반환용 메소드 추가
 public int getTotal() {
  return this.kor + this.eng + this.mat;
 }
 
 
}

 

 


//Main.java
package com.test;

import java.util.*;

public class Main {

 public static void main(String[] args) {
  
  
  //입력
  Scanner sc = new Scanner(System.in);
  System.out.print("입력 범위(1~n)?");
  int size = sc.nextInt();
  
  //배열 선언 -> Student 객체 저장용 -> Student 자료형 지정
  Student[] array = new Student[size];
  
  for (int i=0; i<array.length; ++i) {
   System.out.print("이름 국어 영어 수학?");
   String name = sc.next();
   int kor = sc.nextInt();
   int eng = sc.nextInt();
   int mat = sc.nextInt();

   //방법1 -> 생성자 이용
   //Student s = new Student(name, kor, eng, mat);
   
   //방법2 -> setter 이용
   Student s = new Student();
   s.setName(name);
   s.setKor(kor);
   s.setEng(eng);
   s.setMat(mat);
   
   array[i] = s;
  }
  
  sc.close();
  
  //출력(정렬 전)
  System.out.println("정렬 전:");
  for (Student s : array) {
   System.out.printf("%s %d %d %d %d %n"
     , s.getName()
     , s.getKor()
     , s.getEng()
     , s.getMat()
     , s.getTotal());
  }
  
  //처리(정렬 과정)
  //-> Arrays.sort() 메소드 호출
  //배열의 자료형이 기본형인 경우 -> Arrays.sort(배열);
  //배열의 자료형이 참조형인 경우 -> Arrays.sort(배열, 크기 비교 기준 제시->Comparator);
  Arrays.sort(array, new Comparator<Student>() {
   @Override
   public int compare(Student o1, Student o2) {
    //결과값 -> 0, 양수, 음수
    //비교 기준 -> String -> compareTo() 메소드
    //비교 기준 -> int -> 빼기 연산
    //오름 차순 -> o1 원본, o2 비교 대상
    //내림 차순 -> 반대
    return o2.getTotal() - o1.getTotal();
    //return o1.getName().compareTo(o2.getName());
   }
  });
  
  
  //출력(정렬 후)
  System.out.println("정렬 후:");
  for (Student s : array) {
   System.out.printf("%s %d %d %d %d %n"
     , s.getName()
     , s.getKor()
     , s.getEng()
     , s.getMat()
     , s.getTotal());
  }
  

 }

}

 

 

 

 

----------------------------------------------


9. super 키워드는 상위 클래스의 객체를 접근하는 방법이다.

10. 하위 클래스의 객체를 생성하게 되면, 내부적으로 상위 클래스의 객체는 자동 생성된다. super() 생성자 호출 부분 생략된 상태.

11. super()는 상위 클래스의 생성자를 호출하는 구문이다. 하위 클래스의 객체 생성 과정에서 상위 클래스의 객체 생성은 자동 호출된다. 상위 클래스의 매개변수가 있는 생성자를 호출할 때 super() 를 사용한다.

12. 기본생성자가 없는 클래스를 하위 클래스가 상속 받는 경우 super() 생성자 호출 과정이 작동하지 않게 되기 때문에 문제가 발생한다.

 

//Super.java
package com.test;

public class Super {
 
 //기본 생성자가 없으면 자동 생성된다.
 //->컴파일러가 자동 생성해준다.
 //하위클래스에서 객체 생성시 자동 호출될 예정이다.

 //생략된 생성자를 표기한다면 아래와 같다.
 public Super() {
  super(); //Object 클래스의 기본 생성자 호출
 }
 
 public void superMethod() {
  
 }

}

 


//Sub.java
package com.test;

public class Sub extends Super {

 //기본 생성자가 없으면 자동 생성된다.
 //->컴파일러가 자동 생성해준다.
 //기본 생성자가 호출될 때 상위 클래스의 생성자도 같이 호출된다.
 //->super() 가 생략된 상태
 
 //생략된 생성자를 표기한다면 아래와 같다.
 public Sub() {
  super(); //Super 클래스의 기본생성자 호출
 } 
 
 public void subMethod() {
  
 }
}

 


//Sample82.java
package com.test;

public class Sample82 {

 public static void main(String[] args) {
  
  //Sub 클래스의 객체 생성시
  //Sub() 구문에 의해서
  //Sub 생성자가 호출된다.
  Sub sub = new Sub();
  
  sub.subMethod();
  sub.superMethod();

 }

}

 


//Super.java
package com.test;

//상위 클래스
//내부적으로 Object 클래스를 상속 받고 있다.
public class Super {
 
 //기본 생성자 생략
 //기본 생성자 내부에서 상위 클래스 생성자 호출 구문 생략
 /*
 public Super() {
  super(); //Object 클래스의 기본 생성자 호출
 }
 */

}

 


//Sub.java
package com.test;

//하위 클래스 -> Super 클래스를 상위 클래스로 지정
public class Sub extends Super {
 
 private int a;

 //기본 생성자 생략
 //기본 생성자 내부에서 상위 클래스 생성자 호출 구문 생략
 /*
 public Sub() {
  super(); //Super 클래스의 기본 생성자 호출
 }
 */
 
 //매개변수가 있는 생성자 추가
 //->기본 생성자는 자동 생성되지 않게 된다.
 //->현재 클래스를 상속받은 하위 클래스는 객체 생성 과정에서 문제 발생 가능.
 public Sub(int a) {
  this.a = a;
 }
 
 
 
 
}

 


//Sub2.java
package com.test;

public class Sub2 extends Sub {  //X

 //상위 클래스에서 기본생성자가 존재하지 않으므로
 //현재 클래스는 기본생성자를 사용할 수 없는 상태가 된다.
 //->super() 호출 불가능
 
}

 

 

 

13. 상속관계는 is-a(~은 ~이다) 관계를 가진다.

14. 클래스 간의 포함 관계를 맺어 주는 것은
클래스의 멤버변수로 다른 클래스를 선언하는 것을 뜻한다.
포함 관계는 has-a(~은 ~을 가지고 있다) 관계이다.


------------------------------------------------------

 

 

 

'JavaSE' 카테고리의 다른 글

21일차_제어자, 싱글톤, 회원관리_배열  (0) 2015.06.21
20일차_메소드 오버로딩, 메소드 오버라이딩, 메인메뉴 액션  (0) 2015.06.21
18일차_상속  (0) 2015.06.21
17일차_멤버변수  (0) 2015.06.21
16일차_생성자  (0) 2015.06.21
블로그 이미지

알 수 없는 사용자

,

18일차_상속

JavaSE 2015. 6. 21. 07:15

---------------------------------------
상속 (Inheritance)

1. 클래스를 재사용할 수 있도록 파생시키는 방법.
파생의 사전적 의미 : 사물이 어떤 근원으로부터 갈려 나와 생김.

2. 상속의 기본 형식

public class 하위클래스명 extends 상위클래스명 {
 //상위클래스의 멤버들을 하위클래스가 공유하게 된다.
 //자기 만의 고유한 멤버들을 추가할 수 있다.
}

3. Java에서 모든 클래스는 Object 클래스로부터 파생된 상태이므로 Object 클래스는 모든 클래스의 최상위 클래스이다.

4.
 Object 클래스는 명시적인 상속 표기를 하지 않아도 자동 상속된 상태이다. 따라서 모든 클래스는 Object 클래스의 멤버들을 공유할 수 있다.

//Sample87.java
package com.test;

//Object 클래스의 상속은 자동으로 이루어진다.
public class Sample87 {
 //멤버가 전혀 없는 상태의 클래스 작성
 //자동 생성되는 멤버->기본 생성자->객체 생성 과정에서 필수적으로 사용된다.
 //->내부적으로 Object 클래스의 멤버(toString() 등) 공유 가능
}

 

//Main87.java
package com.test;

public class Main87 {

 public static void main(String[] args) {
  
  Sample87 sample = new Sample87();
  
  //Sample87 클래스의 멤버는 전혀 없지만
  //Object 클래스의 멤버를 공유할 수 있기 때문에
  //toString() 메소드를 사용할 수 있다.
  //toString() 메소드 -> 인스턴스의 정보 반환
  System.out.println(sample.toString());
  
  //String 클래스도 Object 클래스의 하위 클래스이지만
  //toString() 메소드의 역할은 내부적으로 재정의(오버라이딩)되어 있다.
  String str = new String("TEST");
  System.out.println(str.toString());
  
  //같은 클래스 다른 객체 생성
  //->해쉬코드 확인
  Sample87 sample2 = new Sample87();
  System.out.println(sample2.toString());
  
  //특정 객체의 참조주소를 저장
  //->같은 객체를 접근할 수 있게 된다.
  //->해쉬코드 확인
  Sample87 sample3 = sample2;
  System.out.println(sample3.toString());
  
  //equals() 메소드는 두 개의 객체가 같은지, 다른지를 확인해준다.
  System.out.println(sample.equals(sample2));
  System.out.println(sample2.equals(sample3));
  
  
  //String 클래스에서의 equals() 메소드는
  //문자열 비교시 사용 -> 오버라이딩
  String a = new String("TEST");
  String b = new String("HELLO");
  String c = new String("TEST");
  String d = new String("test");
  System.out.println(a.equals(b));
  System.out.println(a.equals(c));
  System.out.println(a.equals(d));
  System.out.println(a.equalsIgnoreCase(d));
  

 }

}

 

 

--------------------------------
Object 클래스

java.lang Package

lang 패키지에는 모든 클래스의 상위 클래스인 Object, 기본형을 포함하는 wrapper클래스, String 클래스, 수학적 계산을 위한 Math, Thread, Class, Package 등의 클래스를 포함한다.

1. Object class

자바 클래스 계층에서 최상위 클래스이다.
아무런 클래스도 상속 받지 않은 클래스라도 실제로는 Object 클래스를 상속 받게 된다. 즉, 모든 클래스는 Object를 상속 받게 된다. Object 형의 참조 변수는 어떠한 클래스의 참조 값도 저장 할 수 있다. 클래스의 계층에서 상위 클래스의 참조 변수는 하위 클래스의 참조형을 저장 할 수 있다. primitive 형을 Object 에 직접 대입 할 수는 없다. wrapper 클래스 형태나 배열로 만들면 대입이 가능하다.

 

 


1.1 Object 의 메소드

1) boolean equals(Object obj)

두 개의 객체가 같은지를 비교한다. 이 메소드는 두 개의 객체가 동일한 객체일 때 (즉 메모리 공간의 동일한 공간에 저장된 같은 메모리 일 때)만 true를 리턴한다.

Button a = new Button("foo");
Button b = new Button("foo");
if(a.equals(b)){
System.out.print("equals");
}


두 개의 버튼은 같은 내용을 포함하고 있지만 두 개의 버튼이 저장된 실제의 위치는 다르다. 즉, a가 가리키는 메모리 번지와 b가 가리키는 메모리 번지가 다르다. 그러므로 "equals"는 출력이 되지 않는다.

Integer a = new Integer(3);
Integer b = new Integer(3);
if(a.equals(b)){
System.out.print("equals");
}

두 번째의 코드에서는 "equals"라는 메세지가 출력이 된다. 두 개의 Interger 객체가 3이라는 정수 값을 가지고 있지만 두 개의 객체는 서로 다른 메모리 번지를 가지고 있다. 그래서 Object에서 정의된 equals()에 의하면 flase가 되어야 한다. 하지만 Integer에서는 equals() 함수를 오버라이딩 했다. Object의 equals()는 두 개
의 객체 참조값(메모리 번지)를 비교하지만 이것을 오버라이딩 한 Interger() 함수에서는 그 포함한 값을 비교해서 같은 true를 리턴하도록 오버라이딩한 것이다. 객체의 equals() 메소드를 사용할 때는 equals()가 오버라이딩됐는지를 확인하고 사용해야 한다. 객체.equals(null)은 항상 false 가 리턴된다.

 

 

2) protected void finalize()

가비지 컬렉터가 이 객체를 가비지 컬렉션 할 후보라고 생각할 때( 이 객체를 참조하는 값이 하나도 없을 때)호출된다. 즉, 가비지 컬렉션 되기 전에 호출되는 메소드이다. 객체에 관한 마지막 정리 작업(비메모리 자원의 반환등)을 하는 용도로 주로 쓰인다.

3) Class getClass()

해당 객체의 런타임 클래스를 리턴한다.

[참고]
런타임 클래스

자바는 하위 클래스의 객체가 상위 클래스의 참조 변수에 대입 될 수 있다. 그러므로 객체 참조 변수의 실제적인 형은 실행시간이 되어 봐야 알 수 있다. 아래의 예를 보자.

Object obj = new Object(); //1
System.out.println(obj.getClass()); //2
Integer i = new Integer(7);
obj = i; //3
System.out.println(obj.getClass()); //4
System.out.print(obj.equals(new Integer(7))); //5

결과는 다음과 같다.
class java.lang.Object
class java.lang.Integer

//1 에서 obj 객체가 Object 형으로 선언된다. 그러므로 //2의 getClass() 메소드에 의해 "class java.lang.Object"라는 값이 출력이 된다. //3에서는 Object로 선언된 동일한 변수에 Integer 객체가 대입된다. obj가 실제 참조하고 있는(가리키고 있는) 변수는 Integer형의 객체를 가리키게 된다. 즉 런타임 클래스는 Integer
클래스가 된다. //5에서 obj.equals()를 하면 Object의 equals()메소드가 호출되지 않고 Integer의 equals() 메소드가 호출된다. 즉, 메소드는 런타임 클래스의 메소드가 호출되고 변수는 선언형의 멤버 변수가 참조 된다.

4) String toString()

객체가 표현하는 내용을 String으로 리턴한다. Object의 toString()은 단순히 클래스 이름과 해쉬 코드값을 출력하도록 아래와 같이 정의되어 있다. getClass().getName() + '@' + Integer.toHexString(hashCode()) 이 메소드도 equals()메소드 처럼 그 클래스가 포함하는 내용을 출력하도록 오버라이딩 되어 있는 곳이 있다.

Integer i = new Integer(9);
System.out.print(i.toString()); //Integer i의 정수값이 String으로 변형되어 출력된다.

5) 기타 메소드

* protected Object clone()
이 객체의 값을 가지고 있는 동일한 타입의 객체를 만들어 리턴한다.
* int hashCode()
객체의 hash code 값을 리턴한다.
* void notify()
이 객체가 가지고 있는 락을 기다리는 쓰레드 중 하나를 깨운다.
* void notifyAll()
이 객체가 가지고 있는 락을 기다리는 모둔 쓰레드를 깨운다.
* void wait()
다른 쓰레드가 이 객체에 해당하는 notify()나 notifyAll()을 호출할 때 까지 현재의 쓰레드를 멈춘다.
* void wait(long timeout)
다른 쓰레드가 이 객체에 해당하는 notify()나 notifyAll()을 호출하거나 timeout 만큼의 시간이 지날때 까지 현재의 쓰레드를 멈춘다.
* void wait(long timeout, int nanos)
다른 쓰레드가 이 객체에 해당하는 notify()나 notifyAll()을 호출하거나 timeout 만큼의 시간이 지날때 까지 현재의 쓰레드를 멈춘다. 이 메소드는 void wait(long timeout) 와 비슷하지만 더 세밀한 부분까지 시간을 조절 할 수 있다. 타임 아웃 시간은 1000000*millis+nanos 로 된다.

 

--------------------------------


//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {
  
  //두 객체 간의 비교
  Sample31 s31 = new Sample31();
  Sample31 s32 = new Sample31();
  Sample31 s33 = s32;
  
  //Object 클래스의 멤버인 toString() 메소드는
  //모든 클래스가 사용 가능한 멤버이다.
  //toString() 메소드는 객체의 클래스명@해쉬코드를 반환한다.
  //(단, 오버라이딩된 경우는 예외)
  //toString() 메소드는 표현을 생략할 수 있다.
  System.out.println(s31.toString());
  System.out.println(s32.toString());
  System.out.println(s33.toString());
  System.out.println(s31);
  System.out.println(s32);
  System.out.println(s33);
  
  //Object 클래스의 멤버인 equals() 메소드는
  //모든 클래스가 사용 가능한 멤버이다.
  //equals() 메소드는 객체의 참조주소를 비교해서
  //일치하는지를 반환한다.
  //(단, 오버라이딩된 경우는 예외)
  System.out.println(s31.equals(s32));
  System.out.println(s32.equals(s33));
  
  
  //Wrapper 클래스는 내부적으로
  //toString()과 equals() 메소드를 오버라이딩해서 사용하고 있다.
  Integer i1 = new Integer(10);
  int i1 = 10;

  Integer i2 = new Integer(10);
  Integer i3 = i2;
  
  System.out.println(i1.toString());
  System.out.println(i2.toString());
  System.out.println(i3.toString());
  System.out.println(i1);
  System.out.println(i2);
  System.out.println(i3);
  
  System.out.println(i1.equals(i2));
  System.out.println(i2.equals(i3));
  
 }

}

 

 

 

 

5. 하위 클래스가 상속을 받은 경우 상위 클래스의 멤버들 중에서 public, protected 접근지정자를 가진 멤버들만 접근할 수 있다. private 멤버와 생성자는 제외된다.


접근지정자 종류
- private : 같은 클래스 내부에서만 접근 가능
- (default) : 접근지정자 표기하지 않은 경우. 같은 패키지 내부에서만 접근 가능
- protected : 상위 클래스에서 protected 접근 지정자를 지정한 멤버는 하위 클래스에서만 접근 가능. 단, 같은 패키지에서도 접근 가능.
- public : 모든 경우에서 접근 가능

//SuperSample32.java
package com.test;

//상위 클래스
public class SuperSample32 {
 
 //private 멤버
 private void method1() {
 }
 
 //(default) 멤버
 void method2() {
  this.method1();
 }
 
 //protected 멤버
 protected void method3() {
 }
 
 //public 멤버
 public void method4() {
 }
 

}

 

 

//SubSample32.java
package com.test;

//(같은 패키지)하위 클래스
public class SubSample32 extends SuperSample32 {
 
 //SuperSample32 클래스의 멤버를 공유할 수 있다.
 
 public void method() {
  
  //this.method1(); //private 멤버
  this.method2(); //(default) 멤버
  this.method3(); //protected 멤버
  this.method4(); //public 멤버
  
 }

}

 


//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {
  
  //같은 패키지의 클래스
  SubSample32 s32 = new SubSample32();
  //s32.method1(); //private 멤버
  s32.method2(); //(default) 멤버
  s32.method3(); //protected 멤버
  s32.method4(); //public 멤버
  
  SuperSample32 s33 = new SuperSample32();
  //s33.method1(); //private 멤버
  s33.method2(); //(default) 멤버
  s33.method3(); //protected 멤버
  s33.method4(); //public 멤버
  
 }

}

 


//SubSample32.java
package com.sist;

import com.test.SuperSample32;

//(다른 패키지)하위 클래스
public class SubSample32 extends SuperSample32 {

 //SuperSample32 클래스의 멤버를 공유할 수 있다.
 
 public void method() {
  
  //this.method1(); //private 멤버
  //this.method2(); //(default) 멤버
  this.method3(); //protected 멤버
  this.method4(); //public 멤버
  
 }

}

 


//Main.java
package com.sist;

public class Main {

 public static void main(String[] args) {
  
  //다른 패키지의 클래스
  SubSample32 s32 = new SubSample32();
  //s32.method1(); //private 멤버
  //s32.method2(); //(default) 멤버
  //s32.method3(); //protected 멤버
  s32.method4(); //public 멤버

 }

}

 

 


6. 상속관계를 그림으로 표현한 것을 상속계층도라고 하다.

최상위클래스(Object) <- 상위클래스 <- 하위클래스 <- 최하위클래스(final 키워드 사용)


//FinalSample32.java
package com.test;

//파이널 클래스 : 더 이상 상속이 되지 않는 클래스 (오버라이딩 금지)
public final class FinalSample32 extends SuperSample32 {
 
 //오버라이딩 금지된 메소드
 //자기 자신을 위한 고유 멤버 추가는 가능하다.
  public void method() {
  
  }

}

 


//AnotherSubSample32.java
package com.test;

//상속 관계에 있어서
//상위 클래스를 SuperSample32 클래스로 지정할 수 있다.
//상위 클래스를 SubSample32 클래스로 지정할 수 있다.
//파이널 클래스인 FinalSample32 클래스는 지정할 수 없다.
public class AnotherSubSample32
  extends FinalSample32 {
 
}

 

 

----------------------------------------
요약

1. 상속의 개념
- 상위 클래스에 대한 서브(파생) 클래스를 만드는 행위.

2. 상속의 특징
- 상위 클래스의 멤버를 하위 클래스에서 공유할 수 있다.
- public class 하위클래스명 extends 상위클래스명 { }
- 최상위 클래스는 Object 클래스이다. Object 클래스가 가진 멤버는 모든 클래스의 멤버가 된다. toString(), equals()
- protected 접근제어자(접근지정자)는 상속 관계일 때만 작동.
- 상속 금지(오버라이딩 금지)는 final 키워드 사용.


---------------------------------------------

 

 

 

 

 

 

 

 

 

 

 

 

 

'JavaSE' 카테고리의 다른 글

20일차_메소드 오버로딩, 메소드 오버라이딩, 메인메뉴 액션  (0) 2015.06.21
19일차_상속  (0) 2015.06.21
17일차_멤버변수  (0) 2015.06.21
16일차_생성자  (0) 2015.06.21
15일차_메소드  (1) 2015.06.21
블로그 이미지

알 수 없는 사용자

,

17일차_멤버변수

JavaSE 2015. 6. 21. 07:15

-------------------------------------
멤버변수

1. 변수는 선언 위치, static 키워드 여부에 따라서 성격과 사용 범위가 다릅니다.

2. 선언 위치에 따른 구분
멤버변수 - 클래스 내부에서 선언된 변수
지역변수 - 메소드 또는 프로그램 블럭 내부에서 선언된 변수

3. static 키워드 사용 여부에 따른 구분
static 멤버변수 - static 키워드 사용
instance 멤버변수 - static 키워드 미사용

4. 변수 종류별 역할
멤버변수 - 클래스 내부에서 클래스의 상태를 저장하는 목적을 가진 변수
지역변수 - 메소드 실행 과정에서 임시로 필요한 자료의 상태를 저장하는 목적을 가진 변수
static 멤버변수 - 하나의 클래스에서 생성된 객체들 간의 공유되어야하는 상태 정보를 저장하는 목적을 가진 변수
instance 멤버변수 - 객체가 생성된 후에 객체 내부에서 객체의 상태를 저장하는 목적을 가진 변수


5. 멤버변수 선언 형식

접근지정자 자료형 변수명;
접근지정자 자료형 변수명 = 초기값;
접근지정자 static 자료형 변수명;
접근지정자 static 자료형 변수명 = 초기값;

주의) 멤버변수는 접근지정자 지정 가능하지만, 지역 변수는 접근지정자를 사용할 수 없습니다.
주의) 멤버변수는 외부 접근을 못하게 막는 경우가 일반적이므로 private 접근지정자를 사용합니다. 멤버변수에 대한 외부와의 소통은 getter,setter를 이용합니다.


//Sample24.java
package com.test;

public class Sample24 {
 
 //멤버변수 선언 위치
 //접근지정자 자료형 변수명;
 //접근지정자 자료형 변수명 = 초기값;
 private int a;
 private int b = 10;
 
 public void method1() {
  //지역변수 선언 위치
  //자료형 변수명 = 초기값;
  int c = 20;
  
  //메소드 내부에서는 멤버변수와 지역변수 모두 접근 가능
  //멤버변수 접근시 가급적이면 this 키워드 사용할 것
  System.out.printf("멤버변수 a : %d %n", this.a);
  System.out.printf("멤버변수 b : %d %n", this.b);
  System.out.printf("지역변수 c : %d %n", c);
  
  int i=0;
  for (; i<10; i++) {
   System.out.printf("지역변수 i : %d %n", i);
  }
  System.out.printf("지역변수 i : %d %n", i);
  
 }

 public void method2() {
  //지역변수는 메소드 범위를 벗어날 수 없기 때문에
  //다른 메소드 내부에서 선언된 지역변수를 접근할 수 없다.
  System.out.printf("멤버변수 a : %d %n", this.a);
  System.out.printf("멤버변수 b : %d %n", this.b);
  //System.out.printf("지역변수 c : %d %n", c); //잘못된 접근
 }
 
 public static void method3() {
  //static 멤버에서 instance 멤버(변수 또는 메소드)를 접근할 수 없다.
  //System.out.printf("멤버변수 a : %d %n", this.a); //잘못된 접근
  //System.out.printf("멤버변수 b : %d %n", this.b); //잘못된 접근
  //System.out.printf("지역변수 c : %d %n", c); //잘못된 접근
 }
 
}

 


//Main.java

 

 


6. 멤버변수는 초기값 지정을 하지 않아도 자동으로 기본값으로 초기화가 진행됩니다. 사용자가 직접 초기값을 지정하는 경우는 초기화 과정에서 변수 선언하는 과정에서 초기값을 지정할 수도 있고, 생성자를 통해서 외부에서 받은 값으로 초기화할 수도 있습니다. 마지막으로 초기화 블럭을 이용한 초기화를 할 수 있다.


7. 멤버변수 선언시 초기화 형식 (명시적 초기화)
접근지정자 자료형 변수명 = 초기값;
접근지정자 static 자료형 변수명 = 초기값;

 

8. 생성자를 이용한 멤버변수 초기화 형식
접근지정자 자료형 멤버변수명;
public 클래스명(자료형 지역변수명) {
 this.멤버변수명 = 지역변수명;
}
 
9. 멤버변수는 단순 초기값이 아닌 경우는 초기화 블럭을 이용해서 초기화할 수 있습니다. 초기화 블럭은 초기값 지정을 위해 사용할 수 있는 전용 블럭입니다.

10. 초기화 블럭 형식

접근지정자 자료형 변수명;
{
 변수명 = 초기값 지정을 위한 식;
}

접근지정자 static 자료형 변수명;
static {
 변수명 = 초기값 지정을 위한 식;
}

 

//Sample25.java
package com.test;

public class Sample25 {
 
 //멤버변수 초기화 과정은 세 가지가 있다.
 
 //1.명시적 초기화
 private int a = 10;
 private int b;
 private int c;

 //2.초기화 블럭
 {
  b = 20;
 }
 
 //3.생성자에 의한 초기화
 //기본 생성자
 public Sample25() {
  //방법1
  this(30);
  //방법2
  //this.c = 30;
 }
 
 // 매개변수가 있는 생성자
 public Sample25(int c) {
  this.c = c;
 }
 
 public void method1() {
  System.out.printf("멤버변수 a : %d %n", this.a);
  System.out.printf("멤버변수 b : %d %n", this.b);
  System.out.printf("멤버변수 c : %d %n", this.c);
 }

 
}

 


//Sample26.java
package com.test;

public class Sample26 {
 
 //초기화 블럭을 이용한 배열 변수의 초기화
 private int[] array;
 
 //배열의 크기와 초기값을 정하기 위한 초기화 블럭 추가
 {
  array = new int[10];
  for (int i=0; i<array.length; i++) {
   array[i] = i+1;
  }
 }
 
 public int[] getArray() {
  return array;
 }

}

 

//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {
  
  Sample26 s26 = new Sample26();
  //확장 for문 - 배열 또는 컬렉션 자료형을 가진 자료를 반복 접근할 때 사용
  for (int a : s26.getArray()) {
   System.out.println(a); //1, 2, ... , 10
  }

 }

}

 

11. 초기화 과정이 중복 선언된 경우는 아래 순서에 따라서 초기화가 반복 진행됩니다.

instance 멤버변수인 경우
기본값 -> 명시적초기화 -> 인스턴스 초기화 블럭 -> 생성자를 이용한 초기화

static 멤버변수인 경우
기본값 -> 명시적초기화 -> static 초기화 블럭

 

//Sample27.java
package com.test;

public class Sample27 {
 
 private int[] array;
 
 public Sample27() {
  //방법1
  this(10);
  //방법2
  /*
  this.array = new int[10];
  for (int i=0; i<this.array.length; i++) {
   this.array[i] = i+1;
  }
  */
 }
 
 public Sample27(int length) {
  this.array = new int[length];
  for (int i=0; i<this.array.length; i++) {
   this.array[i] = i+1;
  }
 }

 public int[] getArray() {
  return array;
 }

}

 


//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {
  
  Sample27 s27 = new Sample27();
  //확장 for문 - 배열 또는 컬렉션 자료형을 가진 자료를 반복 접근할 때 사용
  for (int a : s27.getArray()) {
   System.out.println(a); //1, 2, 3, ..., 10
  }

 }

}

 


문제) 객체 생성시 정수형 배열을 임의의 크기로 준비하고, 랜덤 숫자(1~100)를 초기값을 넣는 클래스 작성.

//RandomArray.java
-> 멤버변수, (매개 변수가 있는)생성자, getter

package com.test;

import java.util.*;

public class RandomArray {
 
 private int[] array;
 
 public RandomArray() {
  this(10);
 }
 
 public RandomArray(int size) {
  array = new int[size];
  for (int i=0; i<array.length; ++i) {
   array[i] = (int)(Math.random()*100) + 1;
  }
 }
 
 public int[] getArray() {
  Arrays.sort(array);
  return array;
 }

}


//MainArray.java -> main() 메소드 포함
-> RandomArray 클래스 객체 생성, 객체 생성 과정의 결과물인 배열 출력. 출력시 정렬된 상태가 되도록  한다.

package com.test;

public class MainArray {

 public static void main(String[] args) {
  
  int size = 10; //임의의 크기 지정
  RandomArray random = new RandomArray(size);
  for (int i : random.getArray()) {
   System.out.println(i);
  }

 }

}

 

-----------------------------------------------------

 

 

//Sample28.java
package com.test;

public class Sample28 {
 
 //초기화 실행 순서
 //1.기본값
 //2.명시적 초기화
 //3.초기화 블럭
 //4.생성자
 
 private int a = 10;
 
 {
  this.a = 20;
 }
 
 public Sample28() {
  this.a = 30;
 }

 public int getA() {
  return a;
 }


}

 


//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {
  
  Sample28 s28 = new Sample28();
  System.out.println(s28.getA()); //30

 }

}

 


12. 변수의 종류에 따른 사용 범위
멤버변수 - 클래스 전체에서 접근 가능하고, 사용할 수 있는 상태
지역변수 - 해당 메소드 내부 또는 프로그램 블럭 내부에서만 접근 가능하고, 사용할 수 있는 상태.

주의) 멤버변수와 지역변수가 같은 이름을 사용하는 경우는 메소드 외부에서는 멤버변수가 사용되지만, 중복된 범위를 갖는 메소드 내부에서는 지역변수가 우선권을 갖는다. 하지만 권장하는 방법이 아니므로 가급적이면 고유한 변수명을 사용해야 합니다. 부득이한 경우는 멤버변수는 this.멤버변수명 또는 클래스명.멤버변수명 형태로 사용합니다.

//Sample29.java
package com.test;

public class Sample29 {
 
 //멤버변수
 private int a = 10;
 
 public void method() {
  
  //지역변수 (멤버변수와 같은 이름을 가진 지역변수)
  int a = 20;
  
  System.out.printf("변수 a : %d %n", a);  //20
  System.out.printf("변수 a : %d %n", this.a); //10
  
 }

}

 

 

//Sample30.java
package com.test;

public class Sample30 {
 
 //static 멤버변수
 private static int a = 10;
 //instance 멤버변수
 private int b = 20;


 //getter, setter 생성 과정
 //Eclipse -> Source -> Generate Getters and Setters ... 메뉴 선택

 //private 멤버변수의 값을 외부에서 확인할 때 사용하는 전용 메소드
 public static int getA() {
  return a;
 }
 //private 멤버변수의 값을 외부에서 변경할 때 사용하는 전용 메소드
 public static void setA(int a) {
  Sample30.a = a;
 }
 //private 멤버변수의 값을 외부에서 확인할 때 사용하는 전용 메소드
 public int getB() {
  return b;
 }
 //private 멤버변수의 값을 외부에서 변경할 때 사용하는 전용 메소드
 public void setB(int b) {
  this.b = b;
 }

}

 


//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {
  
  Sample30 s301 = new Sample30();
  Sample30 s302 = new Sample30();
  
  //static 멤버 접근시 클래스명 이용
  Sample30.setA(10);
  System.out.println(Sample30.getA());
  
  s301.setB(20);
  System.out.println(s301.getB()); //20

  s302.setB(30);
  System.out.println(s302.getB()); //30
  
  //문제-instance 멤버변수 b에 대한 상황
  s301.setB(40);
  System.out.println(s302.getB()); //30
  
  //문제-static 멤버변수 a에 대한 상황
  //static 멤버 접근시 instance 변수를 이용할 수는 있지만
  //권장하지 않는다.
  s301.setA(40);
  System.out.println(s302.getA()); //40
  
 }

}

 

----------------------------------------------
과제) 교재 P209~219 연습문제 풀이.

 

//Student.java
package com.test;

public class Student {
 
 private String name;
 private int kor, eng, mat;

 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public int getKor() {
  return kor;
 }
 public void setKor(int kor) {
  this.kor = kor;
 }
 public int getEng() {
  return eng;
 }
 public void setEng(int eng) {
  this.eng = eng;
 }
 public int getMat() {
  return mat;
 }
 public void setMat(int mat) {
  this.mat = mat;
 }
 
 public int getTotal() {
  int result = 0;
  result = this.kor + this.eng + this.mat;
  return result;
 }
 
 public double getAve() {
  double result = 0;
  //result = Math.round(  (this.getTotal() / 3.0) * 100 ) / 100.0;
  result = this.getTotal() / 3.0;
  return result;
 }
 
}

 

 

//Sample75.java
package com.test;

public class Sample75 {

 public static void main(String[] args) {
  
  Student student = new Student();
  student.setName("홍길동");
  student.setKor(100);
  student.setEng(95);
  student.setMat(80);
  
  System.out.printf("%s %d %.2f %n"
     , student.getName()
     , student.getTotal()
     , student.getAve());

 }

}

 

 

 

 

'JavaSE' 카테고리의 다른 글

19일차_상속  (0) 2015.06.21
18일차_상속  (0) 2015.06.21
16일차_생성자  (0) 2015.06.21
15일차_메소드  (1) 2015.06.21
14일차_메소드  (0) 2015.06.21
블로그 이미지

알 수 없는 사용자

,

16일차_생성자

JavaSE 2015. 6. 21. 07:15

-------------------------------------------
생성자 (Constructor)

1. 생성자는 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메소드이다.

인스턴스 생성 기본 형식

클래스이름 변수 = new 클래스이름();

new는 인스턴스 생성 명령이고, 클래스이름()은 생성자 호출 명령이다.
-> 모든 클래스는 내부적으로 생성자가 필수 조건이다.

 

2. 인스턴스 변수의 초기화 작업에 주로 사용된다. 멤버변수는 자동 초기화가 지원되므로 생성자가 없어도 초기화 할 수 있다.

 

3. 기본형식

public 클래스이름() {
}

public 클래스이름(매개변수) {
 this.멤버변수 = 매개변수;
}

 

4. 매개변수가 없는 생성자를 기본생성자라고 하고, 생성자가 전혀 없는 클래스인 경우에만 컴파일 과정에서 기본생성자는 자동 생성된다.
매개변수가 있는 생성자를 만드는 경우는 반드시 기본 생성자가 같이 존재해야 합니다. 기본 생성자가 컴파일 과정에서 자동 생성되지 않기 때문이다.


5. 생성자가 두 개 이상을 정의하는 것을 생성자 오버로딩(overloading)이라고 한다. 오버로딩 상태는 메소드 시그니처(signature)가 다른 상태를 뜻한다. 시그니처는 매개변수 구성을 뜻한다. 매개변수 구성은 매개변수 자료형, 개수, 순서에만 영향을 받는다.

 


//Sample82.java
package com.test;

public class Sample82 {

 //생성자가 없는 클래스 작성
 //(-> 내부적으로 기본생성자-매개변수가 없는 생성자- 자동 생성)
 /*
 public Sample82() {
 }
 */
 
 //멤버변수(자동 초기화 지원)
 private int a;
 
 //getter-> 멤버변수에 대한 간접적인 노출
 public int getA() {
  //멤버변수 a의 값을 외부에 노출시키기 전에
  //가공 처리가 가능한 부분
  return this.a;
 }
 
}

 

//Main82.java
package com.test;

public class Main82 {

 public static void main(String[] args) {

  //객체 생성(new) 및 생성자 호출(Sample82())
  Sample82 sample = new Sample82();
  
  //멤버변수 a의 값(sample.getA())을 출력
  //멤버변수 a는 내부적으로 자동 초기화 실행
  System.out.println(sample.getA()); //0
  //System.out.println(sample.a); //X
  
 }

}

 

 

//Sample83.java
package com.test;

public class Sample83 {

 //인스턴스 멤버변수(자동 초기화 지원)
 private int a;

 //기본생성자가 있는 클래스 작성
 //인스턴스 멤버변수에 대한 초기화 지원
 //객체 생성시 자동 호출 및 실행
 public Sample83() {
  this.a = 10;
 }
 
 //getter-> 멤버변수에 대한 간접적인 노출
 public int getA() {
  //멤버변수 a의 값을 외부에 노출시키기 전에
  //가공 처리가 가능한 부분
  return this.a;
 }
 
}

 


//Main83.java
package com.test;

public class Main83 {

 public static void main(String[] args) {
  
  //객체 생성(new) 및 생성자 호출(Sample83())
  //생성자에 의한 멤버변수 초기화 과정 실행
  Sample83 sample = new Sample83();

  //멤버변수 a의 값(sample.getA())을 출력
  //멤버변수 a는 내부적으로 자동 초기화 실행
  System.out.println(sample.getA()); //10
  
 }

}

 

 


//Sample84.java
package com.test;

public class Sample84 {

 //인스턴스 멤버변수(자동 초기화 지원)
 private int a;

 //매개변수가 있는 생성자가 있는 클래스 작성
 //인스턴스 멤버변수에 대한 초기화 지원
 //객체 생성시 자동 호출 및 실행
 //외부에서 전달된 값을 가지고 멤버변수 초기화
 //주의)매개변수가 있는 생성자 작성시 기본생성자 같이 작성할 것
 public Sample84() {
 }
 public Sample84(int a) {
  this.a = a;
 }
 
 //getter-> 멤버변수에 대한 간접적인 노출
 public int getA() {
  //멤버변수 a의 값을 외부에 노출시키기 전에
  //가공 처리가 가능한 부분
  return this.a;
 }
 
}

 

 

//Main84.java
package com.test;

public class Main84 {

 public static void main(String[] args) {
  
  //객체 생성(new) 및 생성자 호출(Sample84())
  //매개변수가 있는 생성자에 의한 멤버변수 초기화 과정 실행
  //멤버변수 초기화에 사용될 데이터 전달
  Sample84 sample = new Sample84(20);
  
  //멤버변수 a의 값(sample.getA())을 출력
  //멤버변수 a는 외부에서 전달된 값으로 초기화
  System.out.println(sample.getA()); //20

 }

}

 

 


//Sample85.java
package com.test;

public class Sample85 {

 //인스턴스 멤버변수(자동 초기화 지원)
 private int a;
 private int b;

 //생성자 오버로딩
 //생성자가 두 개 이상 정의된 상태
 //->매개변수 구성(자료형, 갯수, 순서)이 다른 경우만 인정
 public Sample85() {
 }
 public Sample85(int a) {
  this.a = a;
 }
 public Sample85(int a, int b) {
  this.a = a;
  this.b = b;
 }

 //매개변수 구성이 같은 경우는 오버로딩이 되지 않는다.
 /*
 public Sample85(int b) {
  this.b = b;
 }
 public Sample85(int b, int a) {
  this.b = b;
  this.a = a;
 }
 */
 
 //getter-> 멤버변수에 대한 간접적인 노출
 public int getA() {
  //멤버변수 a의 값을 외부에 노출시키기 전에
  //가공 처리가 가능한 부분
  return this.a;
 }
 public int getB() {
  return this.b;
 }
 
}

 

 

//Main85.java
package com.test;

public class Main85 {

 public static void main(String[] args) {

  Sample85 sample1 = new Sample85();
  System.out.printf("a:%d, b:%d %n"
    ,sample1.getA(), sample1.getB()); //0, 0
  
  Sample85 sample2 = new Sample85(10);
  System.out.printf("a:%d, b:%d %n"
    ,sample2.getA(), sample2.getB()); //10, 0
  
  Sample85 sample3 = new Sample85(20, 30);
  System.out.printf("a:%d, b:%d %n"
    ,sample3.getA(), sample3.getB()); //20, 30
  

  //문제) 멤버변수 b만 20으로 초기화하려면
  //생성자 호출 과정?
  Sample85 sample4 = new Sample85(0, 20);
  System.out.printf("a:%d, b:%d %n"
    ,sample4.getA(), sample4.getB()); //0, 20
  

  
 }

}


--------------------------------------------------------

 

 

//Human.java
package com.test;

public class Human {
 
 private String gender;
 
 public Human() {
  //랜덤하게 남자 또는 여자가 발생하도록 하는 과정 추가 -> private 메소드 추가
  this.gender = "남자";
 }
 
 //객체 생성시 성별을 결정하는 요소(남, 여)를 받아주는
 //매개변수가 있는 생성자 준비
 public Human(String gender) {
  if (gender.equals("남자") || gender.equals("여자")) {
   this.gender = gender;
  } else {
   //랜덤하게 남자 또는 여자가 발생하도록 하는 과정 추가 -> private 메소드 추가
   this.gender = "여자"; 
  }
 }
 
 //Human 클래스의 객체가 생성된 후에
 //getGenger() 요청시 null 값이 아닌
 //"남자" 또는 "여자"가 반환되도록 한다.
 public String getGender() {
  return this.gender;
 }

}

 

 

//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {
  
  Human human1 = new Human();
  System.out.println(human1.getGender()); //남자
  
  Human human2 = new Human("로봇");
  System.out.println(human2.getGender()); //여자
  
  Human human3 = new Human("남자");
  System.out.println(human3.getGender()); //남자
  
  Human human4 = new Human("여자");
  System.out.println(human4.getGender()); //여자

 }

}

 


//Calculator.java
package com.test;

public class Calculator {
 
 private int op1;
 private int op2;

 //생성자 오버로딩
 public Calculator() {
  this.op1 = 0;
  this.op2 = 0;
 }
 public Calculator(int op1, int op2) {
  this.op1 = op1;
  this.op2 = op2;
 }
 
 //메소드 오버로딩
 public int add() {
  int result = 0;
  result = this.op1 + this.op2;
  return result;
 }
 public int add(int op1, int op2) {
  int result = 0;
  result = op1 + op2;
  return result;
 }

}

 


//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {
  
  //기본 생성자 호출
  Calculator cal1 = new Calculator();
  System.out.println(cal1.add()); //0
  
  //오버로딩 생성자 호출
  Calculator cal2 = new Calculator(10, 20);
  System.out.println(cal2.add()); //30
  
  //오버로딩 메소드 호출
  Calculator cal3 = new Calculator();
  System.out.println(cal3.add(30, 40)); //70

 }

}

 

 


도형(Figure) 클래스를 만들고, 원, 삼각형, 사각형 객체를 적용할 수 있도록 만든다.
 각각의 도형마다 면적을 계산할 수 있는 메소드를 추가한다.
원의 면적 - 반지름*반지름*3.14
삼각형의 면적 - (밑변*높이)/2
사각형의 면적 - 가로*세로

//Circle.java
package com.test;

//원 도형 클래스
public class Circle {
 
 //반지름
 private int radius;
 
 public Circle() {
  this.radius = 1;
 }
 
 public Circle(int radius) {
  this.radius = radius;
 }
 
 public double area() {
  return radius*radius*3.14;
 }

}

 


//Triangle.java
package com.test;

//삼각형 도형 클래스  
public class Triangle {
 
 private int baseLine;
 private int height;
 
 public Triangle() {
  this.baseLine = 1;
  this.height = 1;
 }
 
 public Triangle(int baseLine, int height) {
  this.baseLine = baseLine;
  this.height = height;
 }
 
 public double area() {
  return (baseLine*height)/2.0;
 }

}

 


//Figure.java
package com.test;

//도형 클래스(원, 삼각형, 사각형)
public class Figure {
 
 private Object figure;
 
 public Figure() {
 }
 
 public Figure(Object figure) {
  this.figure = figure;
 }

 public Object getFigure() {
  return figure;
 }

}

 


//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {
  
  Figure figure1 = new Figure(new Circle()); //원 객체
  
  System.out.println(figure1.getFigure());  //Circle 객체의 해쉬코드
  
  System.out.println(((Circle)figure1.getFigure()).area());  //3.14
  
  Figure figure2 = new Figure(new Circle(10)); //원 객체
  
  System.out.println(((Circle)figure2.getFigure()).area());  //3.14
  
  Figure figure3 = new Figure(new Triangle(20,10)); //삼각형 객체
  
  System.out.println(((Triangle)figure3.getFigure()).area());
  

  //문제)
  //사각형 객체-> Figure 객체에 저장
  //사각형의 면적을 얻는 과정 추가
  

  //문제)
  /*
  자료형1 a = new Figure();  //Figure, Object
  자료형2 b = figure1.getFigure(); //Object
  자료형3 c = (Circle)figure1.getFigure();  //Circle, Object
  자료형4 d = ((Circle)figure1.getFigure()).area();  //double, Double, Object
  자료형5 e = (Triangle)figure3.getFigure();
  자료형6 f = ((Triangle)figure3.getFigure()).area();
  */
  
 }

}

 

 

//Rectangle.java
package com.test;

//문제)
//사각형 도형 클래스 작성할 것.
public class Rectangle {
 
 //멤버변수 -> 높이, 너비
 
 //생성자 -> 기본생성자, 매개변수 있는 생성자
 
 //면적 계산용 메소드
 public int area() {
  //계산식
 }

}

 


//Rectangle.java
package com.test;

public class Rectangle {
 
 private int height, width;
 
 public Rectangle() {
 }
 
 public Rectangle(int height, int width) {
  this.height = height;
  this.width = width;
 }

 public double area() {
  return height * width;
 }
 
}

 

 

//MainFigure.java
package com.test;

public class MainFigure2 {

 public static void main(String[] args) {

  Figure[] array = new Figure[5];
  
  array[0] = new Figure(new Circle(10));
  array[1] = new Figure(new Triangle(10, 20));
  array[2] = new Figure(new Rectangle(20, 20));
  array[3] = new Figure(new Circle(20));
  array[4] = new Figure(new Triangle(20,20));
  
  /*
  for (Figure figure : array) {
   //figure.area(); //X
   System.out.println(figure.toString());
   Object obj = figure.getFigure();
   System.out.println(obj.toString());
   if (obj instanceof Circle) {
    Circle circle = (Circle)obj;
    System.out.println(circle.area());
   }
  }
  */
  
  for (Figure figure : array) {
   Object obj = figure.getFigure();     
   if (obj instanceof Circle) {
    System.out.printf("Circle Area : %.2f %n"
      , ((Circle)obj).area() );
   }
   if (obj instanceof Triangle) {
    System.out.printf("Triangle Area : %.2f %n"
      , ((Triangle)obj).area() );
   }
   if (obj instanceof Rectangle) {
    System.out.printf("Rectangle Area : %.2f %n"
      , ((Rectangle)obj).area() );
   }
  }
  
  
 }

}

 

 

 


6. 생성자 내에서 다른 생성자 호출시 this 키워드 사용. 생성자 호출 구문은 반드시 다른 구문보다 먼저 실행되어야 한다.
-> 생성자 오버로딩 상태인 경우 사용


메소드 내에서 다른 메소드 호출시 this 키워드 사용.
-> 인스턴스 메소드인 경우만 가능.


//Sample86.java
package com.test;

public class Sample86 {
 
 private int a, b;
 
 public Sample86() {
  //방법1
  this(10, 10);
  
  //방법2
  /*
  this.a = 10;
  this.b = 10;
  */
 }
 
 public Sample86(int a, int b) {
  this.a = a;
  this.b = b;
 }
 
 public int getA() {
  return this.a;
 }
 
 public int getB() {
  return this.b;
 }

}

 

 

//Main86.java
package com.test;

public class Main86 {

 public static void main(String[] args) {

  Sample86 sample1 = new Sample86();
  System.out.println(sample1.getA()); //10
  System.out.println(sample1.getB()); //10
  
  Sample86 sample2 = new Sample86(20, 20);
  System.out.println(sample2.getA()); //20
  System.out.println(sample2.getB()); //20
  
  
 }

}


-------------------------------------------
요약

1. 생성자
- 생성자  객체 생성시에 호출되는  메소드 이다.
문제) 생성자의 기본 특징 나열할 것
-
-
-
-
-

2. 기본 형식
기본 생성자, 매개변수가 있는 생성자

3. 매개변수가 있는 생성자는 외부에서 전달된 값으로 멤버변수를 초기화할 때 사용.

4. this 키워드 생성자 호출시 사용 가능.
-> 생성자 오버로딩 상태인 경우

 

----------------------------------

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'JavaSE' 카테고리의 다른 글

18일차_상속  (0) 2015.06.21
17일차_멤버변수  (0) 2015.06.21
15일차_메소드  (1) 2015.06.21
14일차_메소드  (0) 2015.06.21
13일차_메소드  (0) 2015.06.21
블로그 이미지

알 수 없는 사용자

,

15일차_메소드

JavaSE 2015. 6. 21. 07:15

----------------------------------------
메소드


13. 같은 클래스 내에 있는 인스턴스 메소드와 static 메소드 간에는 서로 호출할 수는 있으나, 제약이 있다.

인스턴스 메소드에서 다른 인스턴스 메소드 호출 -> 언제든지 가능
인스턴스 메소드에서 static 메소드 호출 -> 언제든지 가능
static 메소드에서 인스턴스 메소드 호출 -> 객체 생성 과정 필요
static 메소드에서 다른 static 메소드 호출 -> 언제든지 가능


//Sample78.java
package com.test;

public class Sample78 {
 
 //instance 멤버변수 등록
 //객체 생성시 객체별로 고유한 멤버
 //자동 초기화 지원->0
 private int a = 10;
 //instance 초기화 블럭 (대체 수단으로 생성자 존재)
 {
  a = 20;
 }
 
 //static 멤버변수 등록
 //현재 클래스의 객체들 간에 공유하고자 하는 값 저장시 사용.
 //객체 생성시 객체에 무관한 유일 멤버
 //자동 초기화 지원->0
 private static int b = 20;
 //static 초기화 블럭
 static {
  b = 30;
 }
 
 public void setA(int a) {
  this.a = a;
 }
 public int getA() {
  return this.a;
 }
 
 //static 멤버변수를 위한 getter, setter
 public static void setB(int b) {
  //this 키워드는 인스턴스 멤버에만 사용가능
  //static 멤버는 '클래스명.멤버' 형태로 사용
  Sample78.b = b;
 }
 public static int getB() {
  return Sample78.b;
 }

}

 


//Main78.java
package com.test;

public class Main78 {

 public static void main(String[] args) {
  
  Sample78 obj1 = new Sample78();
  Sample78 obj2 = new Sample78();
  Sample78 obj3 = new Sample78();
  
  //첫 번째 Sample78 객체의 멤버변수 a에만 영향
  obj1.setA(100);

  //첫 번째 Sample78 객체의 멤버변수 a의 값만
  //100으로 출력되고,
  //나머지 Sample78 객체의 멤버변수 a의 값은
  //초기값 그대로 출력된다.
  System.out.println(obj1.getA());
  System.out.println(obj2.getA());
  System.out.println(obj3.getA());
  
  
  //첫 번째 Sample78 객체의 static 멤버변수 b에 영향
  //모든 객체는 static 멤버변수 b의 값을 공유하고 있다.
  obj1.setB(100);
  System.out.println(obj1.getB());
  System.out.println(obj2.getB());
  System.out.println(obj3.getB());
  
  //static 멤버의 접근은 '클래스명.멤버' 형태로  사용
  Sample78.setB(200);
  System.out.println(Sample78.getB());
  

 }

}

 

 

 

 

//Sample15.java
package com.test;

public class Sample15 {

 //인스턴스 메소드
 public void method1() {
  //다른 인스턴스 메소드 호출(언제든지 가능)
  method2();
  this.method2();
  //다른 static 메소드 호출(언제든지 가능)
  method4();
  Sample15.method4();
 }

 public void method2() {
  System.out.println("클래스의 인스턴스 메소드 호출 테스트!");
 }
 
 //static 메소드
 public static void method3() {
  //다른 인스턴스 메소드 호출(객체 생성 과정 필요)->권장X
  //Sample15 s15 = new Sample15();
  //s15.method2();  
  
  //다른 static 메소드 호출(언제든지 가능)
  method4();
  Sample15.method4();
 }
 
 public static void method4() {
  
 }

}

 

 

//Main.java
package com.test;

public class Main {
 
 //인스턴스 메소드
 public void method1() {
  
  //다른 클래스의 인스턴스 메소드 호출(객체 생성 과정 필요)
  Sample15 s15 = new Sample15();
  s15.method2();
  
  //다른 클래스의 static 메소드 호출
  Sample15.method4();
 }

 //static 메소드
 public static void main(String[] args) {
  
  //다른 클래스의 인스턴스 메소드 호출(객체 생성 과정 필요)
  Sample15 s15 = new Sample15();
  s15.method1();
  
  //다른 클래스의 static 메소드 호출
  Sample15.method4();
  
  //문제)같은 클래스의 인스턴스 메소드 호출
  //->객체 생성 과정 필요
  Main main = new Main();
  main.method1();

 }

}

 

 

14. 매개변수 전달 방법에는 두 가지 방법이 있다.
값에 의한 전달(Call by Value) : 매개변수를 통해서 값을 전달할 때 값 자체가 복사되어서 전달된다.

메소드 호출하는 경우
메소드이름(값);

호출 당하는 메소드의 정의
public 반환자료형 메소드이름(매개변수) {
 //매개변수는 값의 복사본을 가지게 된다.
 //메소드 내부에서 값에 대한 상태를 변화시켜도
 //외부에는 그 변화를 알 수 없다.
}

 

 

참조에 의한 전달(Call by Reference) : 매개변수를 통해서 값을 전달할 때 값 자체가 전달되는 것이 아니라 값의 참조주소만 전달된다. 따라서 참조주소를 받은 매개변수는 메소드 호출 전의 변수와 같은 값을 공유하게 된다.

메소드 호출하는 경우
메소드이름(값);

호출 당하는 메소드의 정의
public 반환자료형 메소드이름(매개변수) {
 //매개변수는 값의 참조주소를 가지게 된다.
 //메소드 내부에서 값에 대한 상태를 변화시키면
 //외부에서 그 변화를 알 수 있다.
}


//Sample79.java
package com.test;

public class Sample79 {
 
 //call by value 방법에 의한 메소드 호출
 //매개변수가 기본형인 경우 발생한다.
 //값이 전달되고, 그 값은 독립적인 상태가 된다.
 //메소드 내부에서 벌어지는 상황을 외부에서 알 수 없으므로
 //결과값을 return 구문에 의해서 되돌려줘야 한다.
 
 public int add(int a, int b) {
  a += b;
  return a;
 }

 /*
 public void add(int a, int b) {
  a += b;
  //return a;
 }
 */

 //call by reference 방법에 의한 메소드 호출
 //매개변수가 참조형인 경우 발생한다.
 //참조주소가 전달되고, 그 값은 공유 상태가 된다.
 //메소드 내부에서 벌어지는 상황을 외부에서 알 수 있으므로
 //결과값을 return 구문에 의해서 되돌려줄 필요가 없다.
 public void add(int[] a, int b) {
  a[0] += b;
  //return a;
 }


}

 


//Main79.java
package com.test;

public class Main79 {

 public static void main(String[] args) {
  
  Sample79 obj = new Sample79();
  
  int a = 10;
  System.out.println(a);

  //기본형 매개변수 사용하는 메소드인 경우
  //call by value 방법이 적용된다.
  a = obj.add(a, 20);
  System.out.println(a);
  
  int[] b = {10};
  System.out.println(b[0]);
  
  //참조형 매개변수 사용하는 메소드인 경우
  //call by reference 방법이 적용된다.
  //-> Arrays.sort(배열);
  obj.add(b, 20);
  System.out.println(b[0]);

 }

}

 

 

 

15. 가변 매개변수를 사용하면 매개변수와 값을 반드시 일치시키지 않아도 값을 받을 수 있다. 가변 매개변수와 일반 매개변수를 같이 사용하는 경우는 가변 매개변수 지정을 마지막에 사용해야 한다.

메소드 호출하는 경우
메소드이름(값1, 값2, ...);

호출 당하는 메소드의 정의
public 반환자료형 메소드이름(자료형 변수명1, 자료형...변수명2) {
 //변수명1은 첫 번째 값만 받게  된다.
 //변수명2는 나머지 값의 갯수와는 관계 없이
 //자료형만 일치시키면 된다.
}


//Sample81.java
package com.test;

public class Sample81 {
 
 public int add(int a, int b) {
  int result = 0;
  result = a + b;
  return result;
 }

 //가변 매개변수를 사용하게 되면
 //내부적으로는 배열로 취급된다.
 public int add(int...args) {
  
  int result = 0;
  //배열이나 컬렉션을 위한 전용 for문
  //for (자료형 변수명 : 배열 또는 컬렉션) {
  //}
  for (int temp : args) {
   result += temp;
  }
  return result;
  
 }
 
}

 

//Main81.java
package com.test;

public class Main81 {

 public static void main(String[] args) {

  Sample81 obj = new Sample81();
  
  //public int add(int a, int b) 메소드 호출
  System.out.println(obj.add(10, 20));
  
  //public int add(int...args) 메소드 호출
  System.out.println(obj.add(10, 20, 30));
  System.out.println(obj.add(10, 20, 30, 40));

 }

}

 

 

16. main() 메소드는 프로그램의 독립적인 실행을 위해서 반드시 존재해야 하는 특수한 메소드이다. 외부 접근이 되야 하므로 public 접근 지정자를 사용하고, 객체 생성과 무관해야 하므로 static 키워드를 사용하고, 외부에서 값을 여러개 입력 받을 수 있도록 하기 위해서 매개변수를 String[] 자료형으로 처리한다. 외부에서 값을 입력하는 방법은 명령 프롬프트에서 실행시 값 지정.

public static void main(String[] args) {
 //args[0] -> 첫 번째 값
 //args[1] -> 두 번째 값
 //...
}

 

 


과제) 일정 범위의 난수를 발생시키는 과정에서 중복된 숫자가 나오지 않도록 개선.
-> public int randomFromAtoB(int a, int b)
-> public static int[] randomFromAtoB(int a, int b, int size)

1) 1~b 까지 저장할 수 있는 배열 준비 및 1~b를 초기값으로 저장
2) 배열 요소 전체를 랜덤하게 뒤섞는다. 처음 요소부터 마지막 요소까지 난수로 발생한 위치의 요소와 바꾸면 된다.
3) 배열 요소 중에서 특정 갯수(n개) 만큼만 새로운 배열에 저장
4) 새로운 배열 반환

 


------------------------------------------------
요약

1. 같은 클래스 내부에서 다른 메소드 호출하는 경우
instance <-> instance (this)
instance -> static
static <-> static
static -> instance (객체 생성)

2. 다른 클래스의 메소드 호출하는 경우
instance -> instance (객체 생성)
instance -> static (클래스이름)
static -> static (클래스이름)
static -> instance (객체 생성)

3. 메소드 호출시 매개변수에 값 전달 방식 두 가지.
instance -> 값 자체 복사복 전달. 메소드 내부 변화에 대한 결과값 반환 필요
reference -> 값의 참조주소 전달.  메소드 내부 변화에 대한 결과값 반환 필요 없음.

4. 가변 매개변수 사용시 값 개수의 제약이 없다.

----------------------------------------

 

 

 

 

 

'JavaSE' 카테고리의 다른 글

17일차_멤버변수  (0) 2015.06.21
16일차_생성자  (0) 2015.06.21
14일차_메소드  (0) 2015.06.21
13일차_메소드  (0) 2015.06.21
12일차_클래스  (1) 2015.06.21
블로그 이미지

알 수 없는 사용자

,

14일차_메소드

JavaSE 2015. 6. 21. 07:14

------------------------------------------
메소드


9. 프로그램 내부에서 반복적으로 동일한 코드가 실행되어야 하는 경우는 메소드를 정의해서 그 안에 실행 코드를 작성하는 것이 좋은 방법이다. 코드의 중복을 제거하는 과정이다. 실행시 메소드 반복 호출을 통해서 두 번 이상 같은 코드가 실행되도록 할 수 있다.

 

10. 메소드는 인스턴스 메소드와 static 메소드(클래스 메소드)를 구분된다. static 메소드는 메소드 정의시 static 키워드를 사용해야 한다. 인스턴스 메소드는 객체와 같은 상태를 유지한다. 객체가 생성될때 각각의 객체마다 고유의 메소드가 존재하게 된다.  static 메소드는 클래스와 같은 상태를 유지한다. 클래스 하나당 하나의 메소드만 존재하게 된다. static 메소드는 객체 생성 과정과 관계 없이 호출이 가능하다. static 메소드는 모든 객체가 동일하게 사용(공유)해야 하는 메소드를 정의할 때 사용한다.

인스턴스 메소드 정의 예
public 반환자료형 메소드이름(매개변수) {
}

static 메소드 정의 예
public
반환자료형 메소드이름(매개변수) {
}

 

 

//ArrayPrint.java
package com.test;

public class ArrayPrint {
 
 //정수형 배열의 값을 (콘솔)출력하는 메소드
 public void arrayPrint(int[] array) {
  for (int i=0; i<array.length; ++i) {
   System.out.printf(" %d", array[i]);
  }
  System.out.println();
 }

}

 


//StaticArrayPrint.java
package com.test;

public class StaticArrayPrint {
 
 //정수형 배열의 값을 (콘솔)출력하는 메소드
 //->static 키워드 추가
 public static void arrayPrint(int[] array) {
  for (int i=0; i<array.length; ++i) {
   System.out.printf(" %d", array[i]);
  }
  System.out.println();
 }

}

 

 

//Sample75.java
package com.test;

public class Sample75 {

 public static void main(String[] args) {
  
  int[] a = {6, 5, 8, 1, 2, 9, 3, 4, 7, 0};
  
  int temp = a[0];
  for (int b=1; b<a.length; ++b) {
   if (temp < a[b]) {
    temp = a[b];
   }
  }
  
  //배열 요소 출력 과정 추가
  //for문 이용하는 경우
  /*
  for (int i=0; i<a.length; ++i){
   System.out.printf("%d ", a[i]);
  }
  System.out.println();
  */
  //전용 메소드 호출하는 경우->인스턴스 메소드
  /*
  ArrayPrint ap = new ArrayPrint();
  ap.arrayPrint(a);
  */

  //전용 메소드 호출하는 경우->static 메소드
  StaticArrayPrint.arrayPrint(a);
  
  System.out.printf("max:%d %n", temp);
  
 }
 
}

 

 

//Sample76.java
package com.test;

import java.util.*;

public class Sample76 {

 public static void main(String[] args) {
  
  //배열 요소 정렬 과정
  int[] a = {6, 5, 8, 1, 2, 9, 3, 4, 7, 0};

  System.out.print("정렬전:");
  StaticArrayPrint.arrayPrint(a);

  //정렬 과정 추가
  //Arrays 클래스의 sort() 메소드 사용
  Arrays.sort(a);
  
  System.out.print("정렬후:");
  StaticArrayPrint.arrayPrint(a);
 
 }

}

 

 

11. (인스턴스)메소드 호출은 클래스 내부, 클래스 외부에 따라서 다른 호출 방법을 사용한다. 같은 클래스의 다른 인스턴스 메소드 호출시에는 메소드이름만으로 호출이 가능하다.  다른 클래스의 인스턴스 메소드 호출하는 경우는 해당 클래스의 객체 생성 과정과 객체를 저장한 참조변수가 존재해야 한다.

클래스 내부인 경우
메소드이름();
this.메소드이름();

클래스 외부인 경우
참조변수명.메소드이름();


12. (static)메소드 호출은 클래스 내부, 클래스 외부, 다른 패키지에 따라서 다른 호출 방법을 사용한다.

클래스 내부인 경우
메소드이름();

클래스 외부인 경우
클래스명.메소드이름();

다른 패키지인 경우 (패키지명을 생략하려면 import 구문 사용)
패키지명.클래스명.메소드이름();

 

//MemberTest.java
package com.test;

public class MemberTest {
 
 //인스턴스 멤버
 //-> 현재 클래스가 객체 생성된 후에만 접근 가능
 //-> 같은 객체의 다른 인스턴스 멤버 접근 가능
 //-> 다른 객체의 다른 인스턴스 멤버 접근 가능
 public void method1() {
  
 }
 
 public void method3() {
  //같은 객체의 다른 인스턴스 멤버가
  //method1() 메소드 접근시
  method1();
  this.method1();
  //같은 클래스의 다른 인스턴스 멤버가
  //method2() 메소드 접근시
  method2();
  MemberTest.method2();
 }
 
 //static 멤버(클래스 멤버)
 //-> 현재 클래스가 객체 생성 유무와 관계 없이 접근 가능
 //-> 인스턴스 멤버, static 멤버 접근 가능
 public static void method2() {
  
 }
 
 public static void method4() {
  //같은 클래스의 다른 static 멤버가
  //method2() 메소드 접근시
  method2();
  MemberTest.method2();
 }
 
 
}

 

 

//Sample77.java
package com.test;

public class Sample77 {

 public static void main(String[] args) {

  //MemberTest 클래스(객체)의 인스턴스 멤버 접근
  //->method1()
  MemberTest mt = new MemberTest();
  mt.method1();
  
  //MemberTest 클래스(객체)의 static 멤버 접근
  //->method2()
  MemberTest.method2();
  
 }

}

 

 

 

----------------------------
가위, 바위, 보 게임에 대한 조건문
가위를 1, 바위를 2, 보를 3로 표현한 경우
승패 규칙은 다음과 같다.

모든 경우의 수
user1  -  user2  -> 승
  1         2        2
  1         3        1
  2         1        2  (중복)
  2         3        3
  3         1        1  (중복)
  3         2        3  (중복)

중복을 제거한 경우의 수
user1  -  user2  -> 승
  1         2        2
  1         3        1
  2         3        3

승과 관련한 수학적 수식
user1    -   user2        -> 승
 1%3->1  !=  (2+1)%3->0     user2
 1%3->1  ==  (3+1)%3->1     user1
 2%3->2  !=  (3+1)%3->1     user2

 

//RockPaperScissors.java
package com.test;

public class RockPaperScissors {
 
 //a~b 사이의 난수 발생 메소드
 //->static 키워드 추가
 public static int randomFromAtoB(int a, int b) {
  int result = 0;
  if (a<b) {
   result = ((int)(Math.random()*b))+a;
  }
  return result;
 }
 
 //판정 메소드
 //->static 키워드 추가
 public static int judgment(int user1, int user2) {
  //비긴 경우(0), user1 승(1), user2 승(2)
  int result = 0;
  if (user1 == user2) {
   result = 0;
  } else {
   result = ( (user1%3) == ((user2+1)%3) )?1:2;
  }
  return result;
 }

}

 

 


//Main77.java
package com.test;

import java.util.Scanner;

public class Main77 {

 public static void main(String[] args) {
  
  //사용자와 컴퓨터(난수)의 가위(1), 바위(2), 보(3) 게임
  int user = 0;
  int comp = 0;

  Scanner sc = new Scanner(System.in);
  String[] rpsMsg = {"가위","바위","보"};
  String[] msg = {"비겼습니다", "사용자가 이겼습니다", "컴퓨터가 이겼습니다."};

  do {
   //입력 과정
   System.out.print("가위(1), 바위(2), 보(3), exit(0)?");
   user = sc.nextInt();
   if (user == 0) {
    break;
   }
   //static 멤버 호출은 '클래스명.멤버' 형식으로 호출한다.
   comp = RockPaperScissors.randomFromAtoB(1, 3);
   
   //출력 과정
   System.out.printf("사용자:%s, 컴퓨터:%s %n"
     , rpsMsg[user-1], rpsMsg[comp-1]);
   System.out.println(msg[RockPaperScissors.judgment(user, comp)]);
  }while(true);
  
  sc.close();
  
  
 }

}

 

 

---------------------------------------------
요약

1. 메소드 정의
- 중복된 요소
- 복잡한 코드 (캡슐화)
- 반환자료형, 매개변수, 메소드이름

2. 메소드 유형
- 인스턴스 : 객체 고유 메소드
- static : 객체 공유 메소드

3. 메소드 호출
- 인스턴스 : 객체 생성 과정 필요
- static : 클래스이름
- 반환자료형, 매개변수

---------------------------------------------

 

'JavaSE' 카테고리의 다른 글

16일차_생성자  (0) 2015.06.21
15일차_메소드  (1) 2015.06.21
13일차_메소드  (0) 2015.06.21
12일차_클래스  (1) 2015.06.21
11일차_객체지향개념, 객체, 클래스, 인스턴스 설명  (1) 2015.06.21
블로그 이미지

알 수 없는 사용자

,

13일차_메소드

JavaSE 2015. 6. 21. 07:14

--------------------------------------
메소드

1. 메소드는 실행 코드 액션 내용을 작성하는 부분. 클래스 멤버의 한 종류.


2. 기본 형식

접근지정자(접근제어자) 리턴자료형 메소드이름(매개변수) {
 //실행 코드
 //return 반환값;
}


3. 접근지정자(접근제어자)는 주로 public 지정. 외부에서 해당 메소드를 어떤 위치(클래스 내부, 클래스 외부, 패키지 내부, 패키지 외부)에서든지 접근 가능하다는 것을 지정하는 키워드.


//Sample73.java
package com.test;

public class Sample73 {
 
 //클래스 멤버
 //-> 멤버변수, 메소드
 
 //메소드 원형
 /*
 접근제어자 반환자료형 메소드이름(매개변수) {
   실행코드;
 }
 */
 public void method1() {

 }
 
 void method2() {
  
 }
 
 private void method3() {
  
 }
 
}

 


//Main73.java -> 같은 패키지
package com.test;

public class Main73 {

 public static void main(String[] args) {
  
  //Sample73 클래스의 객체 생성
  Sample73 sample = new Sample73();
  
  //Sample73 객체의 하위 멤버인 메소드 접근
  sample.method1(); //O
  sample.method2(); //O
  //sample.method3(); //X ->private 멤버

 }

}

 

//Main73.java -> 다른 패키지
package com.sist;

import com.test.*;

public class Main73 {

 public static void main(String[] args) {

  //Sample73 클래스의 객체 생성
  Sample73 sample = new Sample73();
  
  //Sample73 객체의 하위 멤버인 메소드 접근
  sample.method1(); //O
  //sample.method2(); //X ->default 멤버
  //sample.method3(); //X ->private 멤버
  
 }

}

 

 

4. 반환자료형은 기본자료형, 참조자료형 모두 사용할 수 있다. 그외에 void라는 키워드를 사용할 수 있다. 기본자료형, 참조자료형을 사용하는 경우는 메소드 실행의 결과값을 반환할 때 사용될 자료형으로 지정된다. 외부에서 메소드 호출시 반환되는 값을 미리 예상할 수 있도록 하는 역할. void는 반환값이 없는 메소드를 작성할 때 사용한다.


//Sample11.java
package com.test;

public class Sample11 {
 
 public void method1() {
  //반환자료형이 void인 경우는 return 구문이 없다.
 }
 
 public int method2() {
  
  //반환자료형이 기본자료형이면 반환값은 기본자료형의 값이 된다.
  return 0;
 }
 
 public int add(int a, int b) {
  int result = 0;
  
  result = a + b;
  
  return result;
 }

 public Sample09 method3() {
  Sample09 result = null; 
  
  result = new Sample09();
  
  //반환자료형이 클래스이면 반환값은 해당 클래스의 객체가 된다.
  return result;
 }

}

 

//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {
  
  Sample11 s11 = new Sample11();

  //void는 반환자료형이 아니기 때문에
  //반환값이 없는 상태를 의미한다.
  //void a= s11.method1();
  s11.method1();
  
  //반환자료형이 기본자료형인 경우는
  //기본자료형을 가진 변수에 반환값을 저장할 수 있다.
  int b = s11.method2();
  
  //반환자료형이 참조자료형인 경우는
  //참조자료형을 가진 변수에 반환값을 저장할 수 있다.
  Sample09 c = s11.method3();
  c.method1();

 }

}

 

 

5. 반환값이 있는 메소드인 경우는 메소드의 마지막 문장으로 return 반환값; 구문이 존재해야 한다.

예를 들어, 반환값이 없는 경우
public void 메소드이름(매개변수) {
}

예를 들어, 반환값이 있는 경우
public int 메소드이름(매개변수) {
 return 정수값;
}
public String 메소드이름(매개변수) {
 return 문자열;
}
public PrivateMember 메소드이름(매개변수) {
 return PrivateMember의객체;
}


6. 메소드이름은 식별자 작성규칙에 맞춰서 작성한다. 가급적이면 메소드 액션 내용을 알 수 있도록 의미있는 단어 사용.

예를 들어,
public int add(int a, int b) {
 //곱셈 연산
}
public int subtract(int a, int b) {
 //뺄셈 연산
}


7. 매개변수는 필요시 사용한다. 외부에서 값을 메소드에 전달하는 경우에만 사용. 자료형 변수명, 자료형 변수명,... 형태로 작성. 매개변수가 사용된 경우는 외부에서 메소드 호출시 매개변수에 값을 전달해야 한다. 매개변수에 값을 전달하는 경우, 순서, 개수, 자료형이 일치해야 한다.

예를 들어, 메소드 호출하는 경우
[참조변수명.]메소드이름(값1, 값2, ...);

해당 메소드 정의는 아래와 같아야 한다.
public 반환자료형 메소드이름(매개변수1, 매개변수2, ...) {
}

 

 

//Calculator.java
package com.test;

public class Calculator {
 
 //10진수 입력(int)시 2진수 반환(String) 메소드 -> bin
 public String bin(int dec) {
  String result = "";
  do {
   result = String.valueOf(dec%2) + result;
   dec /= 2;
  }while(dec>0);
  return result;
 }

 //문제) 2진수(String) 입력시 10진수(int) 반환 메소드
 //->dec
 //-> 2진수 숫자를 자릿수별로 가중치 곱하기한 결과를 모두 더한다.
 public int dec(String bin) {
  int result = 0;
  for (int i=0; i<bin.length(); ++i) {
   int a = Integer.parseInt(String.valueOf(bin.charAt(i)));
   result += a * Math.pow(2, (bin.length()-1)-i);
   //문제) Math.pow() 부분을 for문으로 대체

  }
  return result;
 } 

}

 

 


//Main74.java
package com.test;

import java.util.*;

public class Main74 {

 public static void main(String[] args) {

  //입력 과정
  Scanner sc = new Scanner(System.in);
  System.out.printf("10진수(n)?");
  int dec = sc.nextInt();
  sc.close();
  
  //출력 과정
  Calculator cal = new Calculator();
  String result = cal.bin(dec);
  System.out.printf("10진수 %d => 2진수 %s %n"
    , dec, result);
  
 }

}

 


//Main75.java
package com.test;

import java.util.Scanner;

public class Main75 {

 public static void main(String[] args) {
  
  //입력 과정
  Scanner sc = new Scanner(System.in);
  //1111(2) -> 15(10)
  System.out.print("2진수(n)?");
  String bin = sc.next();
  sc.close();
  
  //출력 과정
  Calculator cal = new Calculator();
  int result = cal.dec(bin);
  System.out.printf("2진수:%s -> 10진수:%d %n"
    , bin, result);

 }

 
}

 

 

 

//Sample12.java
package com.test;

public class Sample12 {
 
 //메소드 호출시 매개변수의 개수와 순서, 자료형을 일치시켜야 한다.
 public int add(int a, int b) {
  int result = 0;
  
  result = a + b;
  
  return result;
 }

 //메소드 호출시 매개변수의 개수와 순서, 자료형을 일치시켜야 한다.
 public double divide(double a, double b) {
  double result = 0;
  
  result = a / b;
  
  return result;
 }

}

 


//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {
  
  Sample12 s12 = new Sample12();
  
  s12.add(10, 20);
  s12.divide(10.0, 20.0);
  s12.divide(10, 20.0); //암시적 형변환 발생

  //문제) add() 메소드 호출 과정에서 오류의 원인을 작성.
  //s12.add();
  //s12.add(10);
  //s12.add(10, 20, 30);
  //s12.add(10, 20.0);
  
 }

}

 

 


//Sample63.java (난수 발생)
package com.test;

public class Sample63 {

 public static void main(String[] args) {

  //난수 발생 (0 이상 ~ 1 미만)
  for (int i=0; i<10; ++i) {
   double random = Math.random();
   System.out.println(random);
  }
  
  //난수 발생 (0 ~ 9)
  for (int i=0; i<10; ++i) {
   int random = (int)(Math.random()*10);
   System.out.println(random);
  }
  
  //난수 발생 (1 ~ 10)
  for (int i=0; i<10; ++i) {
   int random = (int)(Math.random()*10) + 1;
   System.out.println(random);
  }
  
  //난수 발생 (1 ~ 45)
  for (int i=0; i<10; ++i) {
   int random = (int)(Math.random()*45) + 1;
   System.out.println(random);
  }
  
  //난수 발생 (1 ~ 3)
  for (int i=0; i<10; ++i) {
   int random = (int)(Math.random()*3) + 1;
   System.out.println(random);
  }
  
  //범위 지정 (1~큰값)
  //((int)(Math.random()*큰값)) + 1
  for (int i=0; i<10; ++i) {
   System.out.println(((int)(Math.random()*45))+1);
  }  

 }

}

 

 

//RockPaperScissors.java (가위, 바위, 보 게임에 대한 메소드)
package com.test;

public class RockPaperScissors {
 
 //a~b 사이의 난수 발생 메소드
 public int randomFromAtoB(int a, int b) {
  int result = 0;
  if (a<b) {
   result = ((int)(Math.random()*b))+a;
  }
  return result;
 }
 
 //판정 메소드
 public int judgment(int user1, int user2) {
  //비긴 경우(0), user1 승(1), user2 승(2)
  int result = 0;
  if (user1 == user2) {
   result = 0;
  } else {
   result = ( (user1%3) == ((user2+1)%3) )?1:2;
  }
  return result;
 }

}

 

 

//Main77.java
package com.test;

import java.util.Scanner;

public class Main77 {

 public static void main(String[] args) {
  
  //사용자와 컴퓨터(난수)의 가위(1), 바위(2), 보(3) 게임
  //1. 외부에서 사용자가 가위, 바위, 보 게임을 진행
  //2. 가위->1, 바위->2, 보->3
  //3. 컴퓨터->난수 발생 결과(1~3) 저장
  //4. 사용자와 컴퓨터의 숫자를 비교해서 게임 결과 출력
  //5. 0->비긴 경우, 1->사용자 승, 2->컴퓨터 승
  //6. 위 과정을 무한실행으로 반복 진행.

  int user = 0;
  int comp = 0;

  RockPaperScissors rps = new RockPaperScissors();
  Scanner sc = new Scanner(System.in);
  String[] rpsMsg = {"가위","바위","보"};
  String[] msg = {"비겼습니다", "사용자가 이겼습니다", "컴퓨터가 이겼습니다."};

  do {
   //입력 과정
   System.out.print("가위(1), 바위(2), 보(3), exit(0)?");
   user = sc.nextInt();
   if (user == 0) {
    break;
   }
   comp = rps.randomFromAtoB(1, 3);
   
   //출력 과정
   System.out.printf("사용자:%s, 컴퓨터:%s %n"
     , rpsMsg[user-1], rpsMsg[comp-1]);
   System.out.println(msg[rps.judgment(user, comp)]);
  }while(true);
  
  sc.close();
  
  
 }

}

 

 

 

8. 메소드 내부에서 실행 코드는 사용자가 임의로 작성 가능. 외부에서 볼 때 메소드 내부 실행 코드는 감춰진 상태(캡슐화)이다.
외부에서 볼 때 메소드 구성(정의)을 알 수 있지만, 내부 상태는 알 수 없다.

외부에서 알 수 있는 부분
접근지정자(접근제어자) 리턴자료형 메소드이름(매개변수)

외부에서 알 수 없는 부분
{
 실행코드
 return 반환값;
}

 

//Calculator.java
package com.test;

public class Calculator {
 
 //10진수 입력(int)시 2진수 반환(String) 메소드 -> bin
 public String bin(int dec) {
  String result = "";
  do {
   result = String.valueOf(dec%2) + result;
   dec /= 2;
  }while(dec>0);
  return result;
 }
 
 //문제) 2진수(String) 입력시 10진수(int) 반환 메소드
 //->dec
 //-> 2진수 숫자를 자릿수별로 가중치 곱하기한 결과를 모두 더한다.

 public int dec(String bin) {
  int result = 0;
  for (int i=0; i<bin.length(); ++i){
   int a = Integer.parseInt(String.valueOf(bin.charAt(i)));
   //result += a * Math.pow(2, (bin.length()-1)-i);
   //문제) Math.pow() 부분을 사용자 메소드(pow) 대체
   result += a * this.pow(2, (bin.length()-1)-i);
  }
  return result;
 }
 
 
 //사용자 메소드 추가
 //a의 b승 계산하는 과정을 메소드로 작성
 //->private int pow(int a, int b)
 private int pow(int a, int b) {
  int result = 1;
  for (int i=0; i<b; ++i) {
   result *= a;
  }
  return result;
 }
 
}

 

 

//Main78.java
package com.test;

import java.util.Scanner;

public class Main78 {

 public static void main(String[] args) {

  //문제) Calculator 클래스의
  //두 가지 메소드를 선택적으로 호출하는 과정
  /*
  1. 10진수->2진수
  2. 2진수 -> 10진수
  선택(exit 0)?1
  10진수?10
  10진수:10 -> 2진수:1010
  
  1. 10진수->2진수
  2. 2진수 -> 10진수
  선택(exit 0)?2
  2진수?10
  2진수:10 -> 10진수:2
  */
  Calculator cal = new Calculator();
  Scanner sc = new Scanner(System.in);
  do {
   System.out.println();
   System.out.println("1. 10진수->2진수");
   System.out.println("2. 2진수 -> 10진수");
   System.out.printf("선택(exit 0)?");
   int m = sc.nextInt();
   if (m==0) {
    break;
   }
   if (m==1) {
    System.out.printf("10진수?");
    int dec = sc.nextInt();
    String result = cal.bin(dec);
    System.out.printf("10진수:%d -> 2진수:%s %n"
      , dec, result);
   }
   if (m==2) {
    System.out.printf("2진수?");
    String bin = sc.next();
    int result = cal.dec(bin);
    System.out.printf("2진수:%s -> 10진수:%d %n"
      , bin, result);
   }
   
  }while(true);
  
  sc.close();  
  
 }

}

 

 


-----------------------------------------------
요약

1. 메소드 : 클래스에서 액션 실행 담당.

2. 기본형식

접근지정자(접근제어자) 리턴자료형 메소드이름(매개변수) {
 //실행 코드
 //return 반환값;
}

3. static 키워드

4. main() 메소드


-------------------------------------------------

 

 


 

블로그 이미지

알 수 없는 사용자

,

12일차_클래스

JavaSE 2015. 6. 21. 07:14

-----------------------------
클래스 선언하기

1. 클래스 기본형식

[접근제어자(접근지정자)] class 클래스이름 {

 //멤버변수
 private 자료형 변수명;
 //멤버변수를 위한 getter, setter 메소드 등록
 public void set변수명(외부 데이터) {
  this.변수명 = 외부 데이터;
 }
 public 자료형 get변수명() {
  return this.변수명;
 }

 //메소드
 public 자료형 메소드이름(매개변수) {
  //액션 코드
 }

}


2. 기본 규칙

- class 키워드

- 클래스 이름은 첫 글자를 대문자로 지정하고, 식별자 작성 규칙을 따른다.

- 클래스 범위는 { } 로 표기.

- 클래스 내부에는 멤버를 자유롭게 구성. 멤버변수, 메소드(일반, getter, setter,  생성자)로만 구성된다.

- 멤버변수는 클래스의 객체 상태를 저장할 때 사용. 속성으로 표현되기도 한다.

- 메소드는 클래스의 기능을 구현할 때 사용. 특수 목적으로 setter, getter, 생성자 메소드가 있다.

 

- 접근지정자(접근제어자)는 주로 public 를 사용하거나, 생략하는 경우만 있다. public를 사용하는 경우는 독립적인 물리적 저장이 가능한 상태이고, 외부에서 해당 클래스를 접근할 수 있다는 의미이다. 생략하는 경우는 독립적인 물리적 저장은 가능하지만, 외부에서 접근이 제한된다.

- 물리적 .java 파일은 하나의 클래스만 존재하는 경우가 일반적이지만 물리적 .java 파일 하나 안에 두 개 이상의 클래스가 존재할 수 있다. 이때는 물리적 파일명과 같은 이름을 가진 클래스가 존재해야 하고, public 접근지정자가 붙어 있어야 한다. 다른 클래스는 접근지정자를 붙일 수 없다.

- 클래스는 서로 독립적인 상태이므로 필요시 다른 클래스의 객체를 생성해서 사용할 수 있다. 클래스의 객체가 생성된 후에는 해당 클래스의 접근 가능한 멤버를 사용할 수 있다.

 

 


//Sample01.java
public class Sample01 {
 //사용자 지정 멤버가 존재하지 않는 경우
 //모든 클래스는 내부적으로 기본 멤버를 가지도록 되어 있다.
}

 

//Main01.java
package com.test;

public class Main01 {

 public static void main(String[] args) {
  
  Sample01 sample1 = new Sample01();
  System.out.println(sample1.toString());

  Sample01 sample2 = new Sample01();
  System.out.println(sample2.toString());

 }

}

 

 


//Sample02.java
package com.test;

public class Sample02 {
 
 //멤버변수만 있는 경우
 //멤버변수 역할
 //-> 객체의 상태값 저장
 //-> 외부의 직접적인 영향에 대해 독립적인 것이 좋다.
 //private 자료형 변수명; //->자동 초기화
 //private 자료형 변수명 = 초기값;
 int a = 10;  //-> default 접근제어자
 private int b = 20; //-> private 접근제어자
 public int c = 30; //-> public 접근제어자

}

 


//Main02.java
package com.test;

public class Main02 {

 public static void main(String[] args) {

  Sample02 sample = new Sample02();
  
  sample.a = 100; //직접 영향
  System.out.println(sample.a);
  //sample.b = 200; //X -> private 멤버는 접근 불가
  sample.c = 200; //직접 영향
  System.out.println(sample.c);

 }

}

 

 

 

//Sample03.java
package com.test;

public class Sample03 {
 
 //멤버변수만 있는 경우
 //멤버변수 역할
 //-> 객체의 상태값 저장
 //-> 외부의 직접적인 영향에 대해 독립적인 것이 좋다.
 //private 자료형 변수명; //->자동 초기화
 //private 자료형 변수명 = 초기값;
 private int a = 10;
 private int b = 20;
 private int c = 30;
 
 public void setA(int a) {
  this.a = a;
 }
 public int getA() {
  return this.a;
 }
 public void setC(int c) {
  if (c>=0 && c<=100) {
   this.c = c;
  }
 }
 public int getC() {
  return c;
 }

}

 

 

//Main03.java
package com.test;

public class Main03 {

 public static void main(String[] args) {

  Sample03 sample = new Sample03();

  /*
  sample.a = 100; //X -> setter 대체
  System.out.println(sample.a); //X -> getter 대체
  //sample.b = 200; //X -> private 멤버는 접근 불가
  sample.c = 200; //X
  System.out.println(sample.c); //X
  */
  sample.setA(100); //->간접적인 방법으로 데이터 저장
  System.out.println(sample.getA());
  sample.setC(200); //데이터 저장 거부. 0~100만 허용.
  System.out.println(sample.getC()); //초기값 30 출력

 }

}

 

 

 

 

//Sample04.java
class Sample04 {
 
 //접근지정자(public)가 생략된 클래스 작성
 //외부(패키지)에서 접근이 제한된 클래스가 된다.
 //내부(패키지)에서는 접근이 가능하다.

}

 

//Main04.java -> 같은 패키지
package com.test;

public class Main04 {

 public static void main(String[] args) {

  Sample04 sample = new Sample04(); //O
  System.out.println(sample.toString());

 }

}

 


//Main04.java -> 다른 패키지
package com.sist;

import com.test.*;

public class Main04 {

 public static void main(String[] args) {

  Sample04 sample = new Sample04(); //X
  System.out.println(sample.toString());
  
 }

}

 

//Sample05.java
//나머지 클래스는 접근지정자 생략 (같은 패키지 내에서만 접근 가능)
class Sample06 {
 
}

//물리적 파일명과 일치하는 클래스만 public 지정
public class Sample05 {

}


//Sample07.java
class Sample08 {
 public void method() {
  System.out.println("Sample08 클래스의 메소드!");
 }
}

public class Sample07 {
 public void method() {
  Sample08 s8 = new Sample08();
  s8.method();
 }
}


----------------------------------------
산술연산 메소드가 포함된 클래스 작성

산술연산 목표->클래스->Calculator->멤버 구성->더하기 기능을 가진 메소드, 빼기, 곱하기, 나누기 기능을 가진 메소드 구성


//Calculator.java
package com.test;

public class Caculator {
 
 //산술적 연산 수행하는 계산기 기능 구현
 //더하기, 빼기, 곱하기, 나누기
 //외부 데이터 -> 2개 -> 정수 -> 매개 변수 2개 준비
 //결과값은 더하기, 빼기, 곱하기인 경우 정수
 //결과값은 나누기인 경우 실수
 
 //더하기 메소드
 public int add(int op1, int op2) {
  //지역변수
  int result = 0;
  result = op1 + op2;
  return result;
 }
 
 //빼기 메소드
 public int sub(int op1, int op2) {
  int result = 0;
  result = op1 - op2;
  return result;
 }
 
 //곱하기 메소드 -> multi
 public int multi(int op1, int op2) {
  int result = 0;
  result = op1 * op2;
  return result;
 }
 
 //나누기 메소드 -> div
 //정수/정수 -> 정수(몫)
 //정수/(double)정수 -> 실수
 //-> 0으로는 나눌 수 없습니다(예외)
 public double div(int op1, int op2) {
  double result = 0;
  result = op1 / (double)op2;
  return result;
 }
 
 
 //10진수 입력(int)시 2진수 반환(String) 메소드 -> bin

 public String bin(int dec) {
  String result = "";

  do {
  
   result = String.valueOf(dec%2) + result;
   dec /= 2;

  }while(dec>0);

  return result;
 }

 

 

 

 

 


}

 


//Main05.java
package com.test;

public class Main05 {

 public static void main(String[] args) {
  
  Caculator cal = new Caculator();
  
  int op1 = 10;
  int op2 = 20;
  System.out.printf("%d + %d = %d %n"
     , op1, op2, cal.add(10, 20));
  System.out.printf("%d - %d = %d %n"
    , op1, op2, cal.sub(10, 20));

  //곱하기 결과
  System.out.printf("%d * %d = %d %n"
    , op1, op2, cal.multi(10, 20));
  
  //나누기 결과 -> 실수
  System.out.printf("%d / %d = %f %n"
    , op1, op2, cal.div(10, 20));
  
  //2진수 반환 결과 -> 문자열
  /*
  System.out.printf("%d -> %s %n", op1, cal.bin(op1));
  System.out.printf("%d -> %s %n", op2, cal.bin(op2));
  */
  
 }

}

 

 

//Sample58.java
package com.test;

public class Sample58 {

 public static void main(String[] args) {
  
  //멤버가 없는 클래스에 대한 객체 생성
  ClassTest01 test01 = new ClassTest01();
  //멤버가 없는 클래스이지만 내부적으로 기본 멤버가 존재한다.
  System.out.println(test01.toString());
  
  //멤버가 있는 클래스에 대한 객체 생성
  ClassTest02 test02 = new ClassTest02();
  //setter 메소드 호출
  test02.setA(10);
  //void 가 지정된 메소드는 출력 대상이 될 수 없다.
  //System.out.println(test02.setA(10));
  //getter 메소드 호출
  System.out.println(test02.getA());
  
  //같은 .java 파일 안에 있는 클래스들의 객체 생성
  SubClassTest03 subtest03 = new SubClassTest03();
  subtest03.method();
  ClassTest03 test03 = new ClassTest03();
  test03.method();
  
  //계산기 클래스에 대한 객체 생성
  Calculator cal = new Calculator();
  //더하기 기능을 가진 메소드 호출
  System.out.println(cal.add(10, 20));
  //문제) 빼기, 곱하기, 나누기 연산 메소드 호출
  
  

 }

}

 

 

//ClassTest01.java
package com.test;

public class ClassTest01 {
 
 //멤버가 없는 클래스

}

 

 

//ClassTest02.java
package com.test;

public class ClassTest02 {
 
 //멤버변수
 private int a;
 //getter
 public int getA() {
  return this.a;
 }
 //setter
 public void setA(int a) {
  this.a = a;
 }
 
 //메소드
 //return 값이 없는 메소드에는 void 키워드 지정
 public void method() {
  
 }

}

 


//ClassTest03.java
package com.test;

//물리적 .java 파일 안에 논리적 클래스 추가가 가능하다
//public 접근지정자는 사용할 수 없다.
//논리적으로는 서로 독립된 상태이다.
class SubClassTest03 {
 public void method() {
  
 }
}

public class ClassTest03 {
 public void method() {
  //같은 .java 파일 안에 있는
  //다른 클래스에 대한 객체 생성 과정
  SubClassTest03 sub = new SubClassTest03();
  sub.method();
 }
}

 


//Calculator.java
package com.test;

public class Calculator {
 
 //산술 연산 기능을 메소드로 추가
 //add, sub, multi, div
 public int add(int op1, int op2) {
  return op1 + op2;
 }
 
 public int sub(int op1, int op2) {
  return op1 - op2;
 }
 
 //문제) 곱하기, 나누기 연산 메소드 추가
 public int multi(int op1, int op2) {
  return op1 * op2;
 }
 
 public double div(int op1, int op2) {
  //return op1 / op2; //암시적 형변환
  return op1 / (double)op2; //명시적 형변환
 } 

}

 

 

 

----------------------------------
자료형으로서의 클래스 사용

이름, 국어, 영어, 수학이라는 자료를 저장하고 처리하는 과정

이름 -> String
국어, 영어, 수학 -> int
총점 -> int

한 명분의 성적을 처리하는 데는 String, int 변수만 있어도 가능.
여러 명분의 성적을 처리하려면 배열을 준비해야 한다.
배열 여러개를 준비해야만 모든 자료를 처리할 수 있습니다.

성적 데이터의 구성 요소 -> 이름, 국어, 영어, 수학, 총점

성적 데이터를 표현 -> ? 자료형 -> 복합적인 자료를 하나의 데이터를 취급 -> 클래스(사용자 정의 자료형)

성적 클래스 정의
-> 멤버 : 이름, 국어, 영어, 수학, 총점
-> 멤버변수:이름(String), 국어(int), 영어(int), 수학(int)
   메소드:총점(int, 국어+영어+수학 연산)

//Score.java
package com.test;

public class Score {
 
 //사용자 정의 자료형 클래스
 //멤버변수 -> 이름, 국어, 영어, 수학 데이터
 private String name;
 private int kor, eng, mat;
 
 //getter, setter 메소드 추가
 /*
 public 자료형 get변수명() {
  return this.변수명;
 }
 public void set변수명(자료형 변수명) {
  this.변수명 = 변수명;
 }
 */
 public void setName(String name) {
  this.name = name;
 }
 public String getName() {
  return this.name;
 }
 public void setKor(int kor) {
  this.kor = kor;
 }
 public int getKor() {
  return this.kor;
 }
 public void setEng(int eng) {
  this.eng = eng;
 }
 public int getEng() {
  return this.eng;
 }
 public void setMat(int mat) {
  this.mat = mat;
 }
 public int getMat() {
  return this.mat;
 }
 
 public int getTotal() {
  int result = 0;
  result = kor + eng + mat;
  return result;
 }
 
 //문제) 평균 계산 메소드 추가 -> getAve()
 public double getAve() {
  double result = 0;
  result = (kor + eng + mat)/3.0;
  return result;
 }
 
 

}

 

 

//Main05.java
package com.test;

public class Main05 {

 public static void main(String[] args) {
  
  Score score = new Score();
  score.setName("HONG");
  score.setKor(100);
  score.setEng(100);
  score.setMat(100);

  System.out.printf("%s %d %d %d %n"
    , score.getName()
    , score.getKor()
    , score.getEng()
    , score.getMat());
  
 }

}

 

 

//Main06.java
package com.test;

public class Main06 {

 public static void main(String[] args) {
  
  //Score 객체 여러개를 저장할 수 있는 배열 준비
  Score[] array = new Score[5];
  
  //입력 과정
  Score score = new Score();
  score.setName("PARK");
  score.setKor(100);
  score.setEng(100);
  score.setMat(100);
  array[0] = score;

  //출력 과정
  System.out.printf("%s %d %d %d %d %n"
    , score.getName()
    , score.getKor()
    , score.getEng()
    , score.getMat()
    , score.getTotal());

 }

}

 

 

 

//Main07.java
package com.test;

import java.util.*;

public class Main07 {

 public static void main(String[] args) {

  //입력 과정 -> 외부 입력
  Scanner sc = new Scanner(System.in);
  System.out.print("입력 범위(1~n)?");
  int n = sc.nextInt();
  Score[] array = new Score[n];
  for (int i=0; i<array.length; ++i) {
   System.out.printf("이름(%d) 국어 영어 수학?", (i+1));
   Score score = new Score();
   score.setName(sc.next());
   score.setKor(sc.nextInt());
   score.setEng(sc.nextInt());
   score.setMat(sc.nextInt());
   array[i] = score;
  }
  sc.close();
  
  //출력 과정
  System.out.println("이름 국어 영어 수학 총점 평균");
  for (int i=0; i<array.length; ++i) {
   Score score = array[i];
   System.out.printf("%s %d %d %d %d %f %n"
     , score.getName()
     , score.getKor()
     , score.getEng()
     , score.getMat()
     , score.getTotal()
     , score.getAve());
  }

 }

}

 

 

 

 

 


-----------------------------------------
자료형으로서의 클래스 사용

이름, 전화번호, 이메일 저장용 클래스 작성 및 데이터 저장,출력 액션.

회원 클래스
-> 멤버 : 이름, 전화번호, 이메일
-> 멤버변수 : 이름(String), 전화번호(String), 이메일(String)
   메소드 : getter,setter


실행 예)
회원 추가 ----------------------
입력 범위(1~n)?2
회원(1)?kim 010-111-2222 kim@test.com
회원(2)?park 010-233-1233 park@nate.com

-------------------------------
kim 010-111-2222 kim@test.com
park 010-233-1233 park@nate.com
--------------------------------
총 2명
--------------------------------


//MemberInfo.java
package com.test;

public class MemberInfo {
 
 //이름, 전화번호, 이메일 저장용 클래스
 //멤버변수, getter, setter
 /*
 private String name;
 private String telephone;
 private String email;
 */
 private String name, telephone, email;
 
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }

 //문제) telephone, email 멤버변수에 대한 getter, setter 작성.
 public String getTelephone() {
  return telephone;
 }
 public void setTelephone(String telephone) {
  this.telephone = telephone;
 }
 public String getEmail() {
  return email;
 }
 public void setEmail(String email) {
  this.email = email;
 }
 
}

 

 


//Main.java
package com.test;

import java.util.*;

public class Main {

 public static void main(String[] args) {
  
  //입력 과정 -> 화면 구성, 액션
  //저장소->배열
  //->이름, 전화번호, 이메일 정보 저장
  //->MemberInfo 클래스
  //->배열의 자료형 -> MemberInfo 클래스 자료형
  //->MemberInfo 객체 저장 액션
  Scanner sc = new Scanner(System.in);
  
  //배열의 크기 지정하는 과정
  System.out.print("입력범위(2~n)?");
  int n = sc.nextInt();
  MemberInfo[] array = new MemberInfo[n];
  
  //배열 크기 만큼 반복해서 입력 받는 과정
  for (int i=0; i<array.length; ++i) {
   //이름, 전화번호, 이메일 정보를 입력 받는 과정
   System.out.print("이름 전화번호 이메일?");
   //한 명분의 정보를 저장할 수 있는 MemberInfo 객체 생성하는 과정
   MemberInfo memberInfo = new MemberInfo();
   //한 명분의 이름, 전화번호, 이메일 정보를
   //외부에서 받고, 그 정보를 객체에 저장하는 과정
   memberInfo.setName(sc.next());
   memberInfo.setTelephone(sc.next());
   memberInfo.setEmail(sc.next());
   //외부 데이터가 저장된 MemberInfo 객체의
   //참조주소를 배열에 저장하는 과정
   array[i] = memberInfo;
  }
  
  sc.close();
  
  //출력 과정 -> 화면 구성, 액션
  System.out.println("-------------------------------------");
  System.out.printf("총 %d명 %n", n);
  System.out.println("-------------------------------------");
  //출력서식에서 %-10s는 10자리 공간에 문자열 출력하되, 왼쪽부터 출력된다는 뜻
  System.out.printf("%-10s %-15s %-15s %n"
    , "NAME","TELEPHONE", "EMAIL");
  //배열(저장소)에 저장된 MemberInfo 객체를
  //순차적으로 꺼내서 화면에 출력하는 과정
  for (int i=0; i<array.length; ++i) {
   MemberInfo memberInfo = array[i];
   //출력 서식의 갯수(자료형)와
   //데이터의 갯수(자료형)는 일치해야 한다.
   //정수 출력시->%d
   //실수 출력시->%f
   //문자열 출력시->%s
   //줄바꿈->%n
   System.out.printf("%-10s %-15s %-15s %n"
     ,memberInfo.getName()
     ,memberInfo.getTelephone()
     ,memberInfo.getEmail());
  }


 }

}

 

-------------------------------------------------
요약

1. 클래스 - 데이터 표현하는 방법

2. 객체 지향 프로그래밍의 기본적인 단위.
객체 지향 프로그램 -> 클래스(기관차, 객차, 식당차...)의 집합 또는 조합.

3. 클래스 설계 -> 멤버 구성 -> 멤버변수, 메소드(일반, getter, setter, 생성자)

4. 멤버변수는 접근지정자(접근제어자)를 private으로 지정. 외부에서 접근 불가능. 외부에서 멤버변수 접근을 위해서 getter, setter 준비.

5. 메소드는 접근지정자(접근제어자)를 public으로 지정. 외부에서 접근 가능.

6. 객체 생성 과정을 통해서 클래스 사용. new 연산자 이용.

 

 

 

 

 

----------------------------------------

블로그 이미지

알 수 없는 사용자

,

-------------------------------------
객체 지향 프로그래밍

1. Object Oriented Programming


2. 절차 지향적 프로그래밍 방식은 데이터를 처리하는 방법에 중심으로 두고, 어떤 방법론으로 처리하는 것이 효과적인지, 효율적인지를 연구했던 방식이다.


3. 객체 지향적 프로그래밍 방식은 데이터 자신을 프로그램 처리의 대상으로 보고, 데이터 자신에게 처리 방법을 포함함으로써 독립적인 처리가 가능하도록 만든 프로그래밍 방법이다.

객체 지향 프로그래밍에서는 데이터가 독립적인 상태가 되도록 하기 위해서 클래스라는 형태로 만들게 된다.

클래스는 속성과 기능을 멤버로 구성하게 된다. 속성은 멤버변수, 기능은 메소드로 표현한다.

프로그램의 대상인 데이터를 클래스로 표현하고, 해당 클래스를 사용 가능한 상태인 인스턴스(객체화)로 만들어서 데이터 처리를 하게 된다.

클래스는 독립적이지만 다른 클래스와 조합을 해서 하나의 큰 프로그램을 운영하게 된다.

 

3. 클래스 기본형식

class 클래스이름 {

 //멤버변수
 private 자료형 변수명;
 //멤버변수를 위한 getter, setter 메소드 등록
 public void set변수명(외부 데이터) {
  this.변수명 = 외부 데이터;
 }
 public 자료형 get변수명() {
  return this.변수명;
 }

 //메소드
 public 자료형 메소드이름(매개변수) {
  //액션 코드
 }

}


4. 클래스(class)를 사용하려면 객체화 시켜야 한다. 클래스가 객체화된 상태를 인스턴스(instance)라고 한다. 인스턴스로 만들어진 클래스는 참조주소를 통해서 접근하게 된다.

 클래스이름 변수 = new 클래스이름();

형태의 명령을 이용해서 인스턴스를 생성한다.

클래스는 사용자가 인스턴스 생성 명령을 실행할 때마다 메모리에 독립적인 인스턴스가 생성된다. 각각의 인스턴스는 메모리 내에서는 독립적인 상태가 된다.

 

//Printer.java
package com.test;

public class Printer {
 
 private int ink = 0;
 
 public void setInk(int ink) {
  this.ink = ink;
 }
 
 public void print(String msg) {
  //인쇄 고유 기능 실행
  if (ink > 0) {
   System.out.println(msg);
   --ink;
  } else {
   System.out.println("잉크가 부족합니다.");
  }
 }

}

 


//Main.java
package com.test;

public class Main {

 public static void main(String[] args) {

  Printer p = new Printer();
  
  p.print("테스트 인쇄1"); //X
  p.setInk(5);
  p.print("테스트 인쇄2"); //O
  p.print("테스트 인쇄3"); //O
  p.print("테스트 인쇄4"); //O
  p.print("테스트 인쇄5"); //O
  p.print("테스트 인쇄6"); //O
  p.print("테스트 인쇄7"); //X
  
 }

}

 

 

 

예를 들어,
마카보드를 클래스로 표현하려면, 마카보드의 속성과 기능을 분석해야 한다.
마카보드의 속성->색상
마카보드의 기능->쓰기

속성과 기능을 클래스 표현에서 멤버변수와 메소드(getter, setter 포함)로 표현한다.

//MarkerBoard.java
package com.test;

//마커보드 데이터를 클래스로 표현합니다.
public class MarkerBoard {
 
 //멤버변수 - 객체의 속성(상태값 저장용 변수)
 private String color;
 
 //멤버변수와 외부의 의사소통을 위한 전용 메소드
 //getter, setter 메소드 등록
 public void setColor(String color) {
  this.color = color;
 }
 public String getColor() {
  return this.color;
 }
 
 //메소드(기능) 정의
 public void write(String msg) {
  System.out.println(msg);
 }

}

 

마카보드 클래스를 인스턴스로 만들려면 아래와 같이 main() 메소드 내에서 인스턴스 생성 명령을 실행합니다.
//Main.java
package com.test;

import java.awt.Color;

public class Main {

 public static void main(String[] args) {
  
  //클래스에 대한 인스턴스 생성 과정(객체화)
  MarkerBoard mb = new MarkerBoard();
  
  //setter 메소드를 이용한 객체의 상태값 변경
  mb.setColor(Color.red.toString());
  
  //해당 객체의 기능(write) 호출
  mb.write(String.format("객체 지향 프로그래밍 테스트!(%s)"
     , mb.getColor()));

 }

}

 

 

프린터를 클래스로 표현
프린터 속성 -> 잉크, 종이 -> 멤버변수 표현
프린터 기능 -> 인쇄 -> 메소드 표현

//Printer.java
package com.test;

public class Printer {
 
 //멤버변수
 private int ink;
 private int paper;
 
 //getter, setter 메소드 준비
 public int getInk() {
  return this.ink;
 }
 public int getPaper() {
  return this.paper;
 }
 public void setInk(int ink) {
  this.ink = ink;
 }
 public void setPaper(int paper) {
  this.paper = paper;
 }
 
 //잉크 보충 및 종이 보충 메소드
 public void addInk(int ink) {
  this.ink += ink;
 }
 public void addPaper(int paper) {
  this.paper += paper;
 }
 
 //Printer 클래스의 기능 구현
 public void print(String msg) {

  if (this.getInk()>0 && this.getPaper()>0) {

   //메시지 출력
   System.out.println(msg);
   
   //인쇄가 끝나면 잉크(-5)와 종이(-1)를 감소 시키는 과정 진행
   this.setPaper(this.getPaper() - 1);
   this.setInk(this.getInk() - 5);
   
  } else {
   System.out.println(String.format("잉크(%d) 또는 종이(%d)가 부족합니다.", this.getInk(), this.getPaper()));
  }

 }

}

 

 

//Main.java
package com.test;

import java.awt.Color;

public class Main {

 public static void main(String[] args) {
  
  //Printer 클래스에 대한 인스턴스 생성 과정(객체화)
  Printer printer = new Printer();
  printer.setInk(10);
  printer.setPaper(10);
  printer.print("테스트 인쇄1!");
  printer.print("테스트 인쇄2!");
  
  //printer.addInk(5);
  printer.print("테스트 인쇄3!");

 }

}

 

 

 

//LEDTV01.java
package com.test;

public class LEDTV01 {
 
 //volumn up, down 기능
 //->volumn 속성, volumnUp() 메소드, volumnDown() 메소드
 
 //멤버변수
 //클래스의 상태값을 저장하는 속성
 //private 자료형 변수명;
 //클래스 내부에 선언하는 변수->멤버변수
 //메소드 내부에 선언하는 변수->지역변수
 //멤버변수는 자동 초기화를 지원한다.
 //LEDTV 객체의 볼륨값을 저장하는 멤버변수 추가
 private int volumn;
 
 //멤버변수를 위한 전용 메소드 -> getter
 //getter를 이용하면 멤버변수의 현재 값을 외부에 노출시킬 수 있다.
 public int getVolumn() {
  return volumn;
 }
 
 //메소드
 //클래스의 기능 구현을 위한 멤버
 /*
 public 반환자료형 메소드이름(매개변수) {
  실행코드;
 }
 */
 //LEDTV 객체의 볼륨을 조정하는 메소드 추가
 //객체의 내부 상태(멤버변수의 값)를 조절할 때 많이 사용한다.
 public void volumnUp() {
  ++volumn;
 }
 public void volumnDown() {
  --volumn;
 }


}

 

 


//Main01.java
package com.test;

public class Main01 {

 public static void main(String[] args) {
  
  //지역 변수 선언
  //-> 초기화 생략
  int a;
  
  //초기화 과정 추가
  a = 0;
  
  //지역 변수의 값 출력->오류
  System.out.println(a);
  
  //클래스에 대한 인스턴스 생성
  LEDTV01 ledTV = new LEDTV01();
  
  //인스턴스를 이용해서 해당 클래스의 메소드를
  //호출할 수 있다.
  //메소드 호출시마다 내부적으로
  //준비된 액션이 실행된다.
  ledTV.volumnUp(); //volumn +1
  ledTV.volumnUp(); //volumn +1
  ledTV.volumnUp(); //volumn +1
  
  //getter 메소드는 해당 클래스의 상태를
  //보여주는 멤버변수의 값을 보여주기 위한
  //전용 메소드이다.
  System.out.println(ledTV.getVolumn()); //3
  
 }

}

 

 

 

//LEDTV02.java
package com.test;

public class LEDTV02 {
 
 //volumn up, down 기능
 //->volumn 속성, volumnUp() 메소드, volumnDown() 메소드
 
 //멤버변수
 //객체의 상태값을 저장하는 속성
 //private 자료형 변수명;
 //클래스 내부에 선언하는 변수->멤버변수
 //메소드 내부에 선언하는 변수->지역변수
 //멤버변수는 자동 초기화를 지원한다.
 //LEDTV 객체의 볼륨값을 저장하는 멤버변수 추가
 private int volumn;
 
 //멤버변수를 위한 전용 메소드 -> getter
 //getter를 이용하면 멤버변수의 현재 값을
 //외부에 노출시킬 수 있다.
 public int getVolumn() {
  return volumn;
 }
 
 //메소드
 //클래스의 기능 구현을 위한 멤버
 /*
 public 반환자료형 메소드이름(매개변수) {
  실행코드;
 }
 */
 //LEDTV 객체의 볼륨을 조정하는 메소드 추가
 //객체의 내부 상태(멤버변수의 값)를 조절할 때 많이 사용한다.
 //볼륨 up, down 액션과 동시에 결과(현재 볼륨 값)를 반환하도록 수정합니다.
 public int volumnUp() {
  ++volumn;
  return getVolumn();
 }
 public int volumnDown() {
  --volumn;
  return getVolumn();
 }


}

 

 

//Main02.java
package com.test;

public class Main02 {

 public static void main(String[] args) {
  
  LEDTV02 ledTV = new LEDTV02();

  //볼륨을 증가시키는 액션과
  //현재 볼륨값을 출력하는 액션을 같이 실행합니다.
  System.out.println(ledTV.volumnUp()); //volumn +1, 반환값 존재->출력 액션
  System.out.println(ledTV.volumnUp()); //volumn +1, 반환값 존재->출력 액션
  System.out.println(ledTV.volumnUp()); //volumn +1, 반환값 존재->출력 액션

  System.out.println(ledTV.volumnDown()); //volumn -1, 반환값 존재->출력 액션
  System.out.println(ledTV.volumnDown()); //volumn -1, 반환값 존재->출력 액션
  System.out.println(ledTV.volumnDown()); //volumn -1, 반환값 존재->출력 액션
  System.out.println(ledTV.volumnDown()); //X
  


 }

}

 

 

 

//LEDTV03.java
package com.test;

public class LEDTV03 {
 
 //volumn up, down 기능
 //->volumn 속성, volumnUp() 메소드, volumnDown() 메소드
 
 //멤버변수
 //객체의 상태값을 저장하는 속성
 //private 자료형 변수명;
 //클래스 내부에 선언하는 변수->멤버변수
 //메소드 내부에 선언하는 변수->지역변수
 //멤버변수는 자동 초기화를 지원한다.
 //LEDTV 객체의 볼륨값을 저장하는 멤버변수 추가
 private int volumn;
 
 //멤버변수를 위한 전용 메소드 -> getter
 //getter를 이용하면 멤버변수의 현재 값을
 //외부에 노출시킬 수 있다.
 public int getVolumn() {
  return volumn;
 }
 
 //메소드
 //클래스의 기능 구현을 위한 멤버
 /*
 public 반환자료형 메소드이름(매개변수) {
  실행코드;
 }
 */
 //LEDTV 객체의 볼륨을 조정하는 메소드 추가
 //객체의 내부 상태(멤버변수의 값)를 조절할 때 많이 사용한다.
 //볼륨 up, down 액션과 동시에 결과(현재 볼륨 값)를 반환하도록 수정합니다.
 //볼륨의 범위는 0~10으로 한정시키는 과정 추가
 public int volumnUp() {
  if (volumn < 10) {
   ++volumn;
  }
  return getVolumn();
 }
 public int volumnDown() {
  if (volumn > 0) {
   --volumn;
  }
  return getVolumn();
 }


}

 

 

//Main03.java
package com.test;

public class Main03 {

 public static void main(String[] args) {
  
  LEDTV03 ledTV = new LEDTV03();
  
  System.out.println(ledTV.volumnUp()); //+1
  System.out.println(ledTV.volumnUp()); //+1
  
  System.out.println(ledTV.volumnDown()); //-1
  System.out.println(ledTV.volumnDown()); //-1
  System.out.println(ledTV.volumnDown()); //-1 -> 0에서 멈춤.

 }

}

 

 

문제) LEDTV 클래스에 볼륨 기능 외에 전원 기능을 추가합니다.
- 전원의 초기값은 off 상태
- 전원on/off 기능 구현
- 전원 on 상태인 경우만 볼륨 up, down 작동

//LEDTV04.java
package com.test;

public class LEDTV04 {
 
 //volumn up, down 기능
 //->volumn 속성, volumnUp() 메소드, volumnDown() 메소드
 //전원 on, off 기능
 //->power 속성, power() 메소드
 
 //멤버변수
 //객체의 상태값을 저장하는 속성
 //private 자료형 변수명;
 //클래스 내부에 선언하는 변수->멤버변수
 //메소드 내부에 선언하는 변수->지역변수
 //멤버변수는 자동 초기화를 지원한다.
 //LEDTV 객체의 볼륨값을 저장하는 멤버변수 추가
 private int volumn;
 private boolean power;
 
 //메소드
 //클래스의 기능 구현을 위한 멤버
 /*
 public 반환자료형 메소드이름(매개변수) {
  실행코드;
 }
 */
 //LEDTV 객체의 볼륨을 조정하는 메소드 추가
 //객체의 내부 상태(멤버변수의 값)를 조절할 때 많이 사용한다.
 //볼륨 up, down 액션과 동시에 결과(현재 볼륨 값)를 반환하도록 수정합니다.
 //볼륨의 범위는 0~10으로 한정시키는 과정 추가
 public int volumnUp() {
  if (power) {
   if (volumn < 10) {
    ++volumn;
   }
   return volumn;
  } else {
   return -1;
  }
 }
 public int volumnDown() {
  if (power) {
   if (volumn > 0) {
    --volumn;
   }
   return volumn;
  } else {
   return -1;
  }
 }
 
 public void power() {
  power = !(power);
 }


}

 

 

 

//Main04.java
package com.test;

public class Main04 {

 public static void main(String[] args) {
  
  LEDTV04 ledTV = new LEDTV04();
  int temp;

  //ON 이전
  System.out.println(((temp = ledTV.volumnUp())==-1)?"Power OFF":temp);

  ledTV.power(); //ON
  //ON 이후
  System.out.println(((temp = ledTV.volumnUp())==-1)?"Power OFF":temp);
  System.out.println(((temp = ledTV.volumnUp())==-1)?"Power OFF":temp);
  System.out.println(((temp = ledTV.volumnDown())==-1)?"Power OFF":temp);

  ledTV.power(); //OFF
  //OFF 이후
  System.out.println(((temp = ledTV.volumnUp())==-1)?"Power OFF":temp);

 }

}

 

 

-----------------------------------------------
요약

1. 객체 지향 개념

2. 객체, 클래스, 인스턴스

3. 멤버변수(속성), 메소드(기능), setter, getter

4. class, new, 참조변수


-----------------------------------------------

 

 

 

 

 

 

 

 


 

블로그 이미지

알 수 없는 사용자

,

------------------------------------------
석차 알고리즘

1. 모든 석차를 1로 설정하고 나서, 기준 점수와 나머지 점수를 비교해서 기준 점수보다 높은 점수가 있으면 기준 점수의 석차를 +1 연산 수행.
         초기값   비교연산     높은 점수+1   결과석차
kim 30    1등    30 [70][60]     +1 +1          3등
choi 70   1등    70 [30][60]                    1등
park 60   1등    60 [30][70]     +1             2등

- 석차 저장용 배열 준비
- 석차 저장용 배열에 초기값 1로 설정
- 자기 점수와 남의 점수를 비교해서 남의 점수가 큰 경우 자기의 석차 배열의 값을 +1 연산

 

//Sample66.java
package com.test;

public class Sample66 {

 public static void main(String[] args) {
  
  //점수 저장용 배열 준비
  //석차 저장용 배열 준비 -> 점수 저장용 배열과 같은 크기
  //석차 저장용 배열에 초기값 1로 설정
  //자기 점수와 남의 점수를 비교해서
  //남의 점수가 큰 경우
  //자기의 석차 배열의 값을 +1 연산

  //입력 과정
  int[] score = {60, 90, 80};
  int[] rank = {1, 1, 1};
  
  //처리 과정
  //석차 계산 과정 추가
  if (score[0] < score[1]) {
   ++rank[0];
  }
  if (score[0] < score[2]) {
   ++rank[0];
  }
  if (score[1] < score[0]) {
   ++rank[1];
  }
  if (score[1] < score[2]) {
   ++rank[1];
  }
  if (score[2] < score[0]) {
   ++rank[2];
  }
  if (score[2] < score[1]) {
   ++rank[2];
  }
  
  //출력 과정
  for (int i=0; i<score.length; ++i) {
   System.out.printf("%d -> %d %n"
      , score[i]
      , rank[i]);
  }
  

 }

}

 

 


//Sample67.java
package com.test;

public class Sample67 {

 public static void main(String[] args) {
  
  //이름 저장용 배열 준비
  //점수 저장용 배열 준비
  //석차 저장용 배열 준비 -> 점수 저장용 배열과 같은 크기
  //석차 저장용 배열에 초기값 1로 설정
  //자기 점수와 남의 점수를 비교해서
  //남의 점수가 큰 경우
  //자기의 석차 배열의 값을 +1 연산

  //입력 과정
  String[] name = {"kim", "choi", "park"};
  int[] score = {60, 90, 80};
  int[] rank = {1, 1, 1};
  
  //처리 과정
  //석차 계산 과정 추가
  //->반복문 처리
  for (int a=0; a<score.length; ++a) {
   for (int b=0; b<score.length; ++b) {
    //if (a==b) continue;
    if (score[a] < score[b]) {
     ++rank[a];
    }
   }
  }
  
  //출력 과정
  for (int i=0; i<score.length; ++i) {
   System.out.printf("%s %d -> %d %n"
      , name[i]
      , score[i]
      , rank[i]);
  }
  

 }

}

 

 


------------------------------------------
여러명의 점수를 입력 받고, 점수가 높은 순으로 석차 부여해서 출력하는 과정 작성. 이름과 점수는 별도의 배열에 저장. 석차 저장용 배열 추가로 필요합니다.
실행 예)
입력 범위(2~n)?3
이름 점수(1)?kim 30
이름 점수(2)?choi 70
이름 점수(3)?park 60
---------------------
kim 30  3등
choi 70 1등
park 60 2등
---------------------

//Sample68.java
package com.test;

import java.util.Scanner;

public class Sample68 {

 public static void main(String[] args) {

  //외부 입력 데이터를 배열에 저장
  //이름 저장용 배열 준비
  //점수 저장용 배열 준비
  //석차 저장용 배열 준비 -> 점수 저장용 배열과 같은 크기
  //석차 저장용 배열에 초기값 1로 설정
  //자기 점수와 남의 점수를 비교해서
  //남의 점수가 큰 경우
  //자기의 석차 배열의 값을 +1 연산

  //입력 과정
  Scanner sc = new Scanner(System.in);
  System.out.print("입력 범위(2~n)?");
  int n = sc.nextInt();
  String[] name = new String[n];
  int[] score = new int[n];
  int[] rank = new int[n];
  
  for (int a=0; a<name.length; ++a) {
   System.out.printf("이름 점수(%d)?", (a+1));
   name[a] = sc.next();
   score[a] = sc.nextInt();
   rank[a] = 1;
  }
  
  sc.close();
  
  //처리 과정
  //석차 계산 과정 추가
  //->반복문 처리
  for (int a=0; a<score.length; ++a) {
   for (int b=0; b<score.length; ++b) {
    //if (a==b) continue;
    if (score[a] < score[b]) {
     ++rank[a];
    }
   }
  }
  
  //출력 과정
  for (int i=0; i<score.length; ++i) {
   System.out.printf("%s %d -> %d %n"
      , name[i]
      , score[i]
      , rank[i]);
  }
  

 }

}

 

 

----------------------------------------------
배열의 배열 (다차원 배열, 가변 배열)

1. 1차원 배열 여러개를 조합해서 사용하는 배열.

2. 사용하기 전에 배열의 크기를 지정해야 한다. 배열 선언(생성)시 크기 지정.
- 배열 선언 기본 형식

자료형[][] 변수명 = new 자료형[크기1][크기2];
=> 크기1은 행의 크기, 크기2는 열의 크기

자료형[][] 변수명 = {{값1, 값2, ...}, {값, ...}, ...};
=> 중간에 표시한 {}의 갯수가 행의 크기, {} 안에 있는 값의 갯수가 열의 크기

3. 배열의 배열은 행(column), 열(row)의 개념으로 사용. 인덱스 사용시 행, 열 를 동시에 표기. 예를 들어, 배열변수[행][열] 형태로 사용.

       1행  2행  3행  4행  5행
1열 -> 1    2    3    4    5 
2열 -> 1    2    3    4    5 
3열 -> 1    2    3    4    5 
4열 -> 1    2    3    4    5 
5열 -> 1    2    3    4    5 

4. 배열변수.length 표현은 행의 갯수를 리턴. 배열변수[인덱스].length 표현은 열의 갯수를 리턴.

5. 가변배열은 각 행마다 열의 갯수가 다른 배열.

자료형[][] 변수명 = new 자료형[크기1][];
=> 크기1은 행의 크기, 크기2는 지정하지 않는다.
변수명[0] = new int[크기2];
변수명[1] = new int[크기3];
...

변수명[n] = new int[크기n];


자료형[][] 변수명 = {{값1, 값2, ...}, {값, ...}, ...};
=> 중간에 표시한 {}의 갯수가 행의 크기, {} 안에 있는 값의 갯수가 열의 크기. {} 안에 있는 값의 갯수가 모두 다르게 지정된 상태.

 

//Sample69.java
package com.test;

public class Sample69 {

 public static void main(String[] args) {
  
  
  //배열의 배열 준비
  int[][] array1 = new int[4][3];
  int[][] array2 = {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}};
  //배열 전체 안에 작은 배열의 갯수가 4이고,
  //작은 배열 안에 요소의 갯수가 3이 된다.
  


  //배열의 배열 요소 출력
  //->바깥쪽 for문은 배열 전체의 작은 배열 갯수만큼 반복
  //->안쪽 for문은 작은 배열 안에 요소의 갯수만큼 반복
  for (int a=0; a<array1.length; ++a) {
   for (int b=0; b<array1[a].length; ++b) {
    System.out.printf(" %d", array1[a][b]);
   }
   System.out.println();
  }

 }
 
}

 

------------------------------------------------
2차원 배열의 초기화 알고리즘
- 2차원 배열을 준비하고, 일련의 숫자를 적당한 순서에 의해서 배열 공간에 저장하는 알고리즘
- 달팽이, 마방진 알고리즘 등


2차원 배열에 다음과 같은 순서로 배열을 초기화.
 1  2  3  4  5
 6  7  8  9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

//Sample70.java
package com.test;

public class Sample70 {

 public static void main(String[] args) {

  int[][] array1 = new int[5][5];
  int[][] array2 = {{1,2,3,4,5}
      , {6,7,8,9,10}
      , {11,12,13,14,15}
      , {16,17,18,19,20}
      , {21,22,23,24,25}};

  //배열의 배열 속에 특정 수를 특정 요소에 넣는 과정
  int a = 0; //1~25
  for (int b=0; b<array1.length; ++b) {
   for (int c=0; c<array1[b].length; ++c) {
    array1[b][c] = ++a;
   }
  }
  
  for (int b=0; b<array1.length; ++b) {
   for (int c=0; c<array1[b].length; ++c) {
    System.out.printf(" %2d", array1[b][c]);
   }
   System.out.println();
  }

 }

}

 

 


2차원 배열에 다음과 같은 순서로 배열을 초기화.
 1  6 11 16 21
 2  7 12 17 22
 3  8 13 18 23
 4  9 14 19 24
 5 10 15 20 25

//Sample71.java
package com.test;

public class Sample71 {

 public static void main(String[] args) {

  int[][] array1 = new int[5][5];
  int[][] array2 = {{1,6,11,16,21}
      , {2,7,12,17,22}
      , {3,8,13,18,24}
      , {4,9,14,19,24}
      , {5,10,15,20,25}};

  //배열의 배열 속에 특정 수를 특정 요소에 넣는 과정
  int a = 0; //1~25
  for (int b=0; b<array1.length; ++b) {
   for (int c=0; c<array1[b].length; ++c) {
    array1[c][b] = ++a;
   }
  }
  
  for (int b=0; b<array1.length; ++b) {
   for (int c=0; c<array1[b].length; ++c) {
    System.out.printf(" %2d", array1[b][c]);
   }
   System.out.println();
  }

 }

}

 

 

문제) 2차원 배열에 다음과 같은 순서로 배열을 초기화.
 1  2  3  4  5
10  9  8  7  6
11 12 13 14 15
20 19 18 17 16
21 22 23 24 25

 

//Sample72.java
package com.test;

public class Sample72 {

 public static void main(String[] args) {

  int[][] array1 = new int[5][5];
  int[][] array2 = {{1,2,3,4,5}
      , {10,9,8,7,6}
      , {11,12,13,14,15}
      , {20,19,18,17,16}
      , {21,22,23,24,25}};

  //배열의 배열 속에 특정 수를 특정 요소에 넣는 과정
  int a = 0; //1~25
  for (int b=0; b<array1.length; ++b) {
   for (int c=0; c<array1[b].length; ++c) {
    if (b%2 == 0) {
     array1[b][c] = ++a;
    } else {
     array1[b][(array1[b].length-1)-c] = ++a;
    }
   }
  }
  
  for (int b=0; b<array1.length; ++b) {
   for (int c=0; c<array1[b].length; ++c) {
    System.out.printf(" %2d", array1[b][c]);
   }
   System.out.println();
  }

 }

}

 


문제)
2차원 배열에 다음과 같은 순서로 배열을 초기화.
 1 10 11 20 21
 2  9 12 19 22
 3  8 13 18 23
 4  7 14 17 24
 5  6 15 16 25

 

package com.test;

public class work {
 public static void main(String ar[]) {
/*
   문제)2차원 배열에 다음과 같은 순서로 배열을 초기화
     1 10 11 20 21
     2  9 12 19 22
     3  8 13 18 23
     4  7 14 17 24
     5  6 15 16 25
 */
  int [][] array1 = new int[5][5];
  
  int a = 0;
  for(int b = 0; b <array1.length; b++){
   for(int c = 0; c<array1[b].length;c++) {
    if(b%2 == 0) {
     array1[c][b] = ++a;
    }else {
     array1[array1[b].length-1-c][b] = ++a;
    }
   }
  }
  for(int b = 0; b < array1.length; b++){
   for(int c = 0; c < array1[b].length; ++c){
    System.out.printf(" %2d", array1[b][c]);
   }System.out.println();
  }
 }
}

 


 

블로그 이미지

알 수 없는 사용자

,