자바프로그래밍 1 클래스와메소드심층연구 ( 실습 ) 손시운 ssw5176@kangwon.ac.kr
예제 1. 접근제어 class A { private int a; int b; public int c; // 전용 // 디폴트 // 공용 public class Test { public static void main(string args[]) { A obj = new A(); // 객체생성 obj.a = 10; // 전용멤버는다른클래스에서는접근안됨 obj.b = 20; // 디폴트멤버는접근할수있음 obj.c = 30; // 공용멤버는접근할수있음 2
예제 2. 설정자와접근자 public class Account { private int regnumber; private String name; private int balance; // 필드 name 과 balance 의 getter, setter 생성 public class AccountTest { public static void main(string[] args) { Account obj = new Account(); obj.setname("tom"); obj.setbalance(100000); System.out.println(" 이름은 " + obj.getname() + " 통장잔고는 " + obj.getbalance() + " 입니다."); 이름은 Tom 통장잔고는 100000 입니다. 3
예제 3. 생성자의예 public class MyCounter { int counter; // 생성자추가 public class MyCounterTest { public static void main(string args[]) { MyCounter obj1 = new MyCounter(); MyCounter obj2 = new MyCounter(); System.out.println(" 객체 1 의 counter = " + obj1.counter); System.out.println(" 객체 2 의 counter = " + obj2.counter); 객체 1 의 counter = 1 객체 2 의 counter = 1 4
예제 4. 매개변수를가지는생성자의예 class MyCounter { int counter; // 예제 3 의생성자수정 public class MyCounterTest { public static void main(string args[]) { MyCounter obj1 = new MyCounter(100); MyCounter obj2 = new MyCounter(200); System.out.println(" 객체 1 의 counter = " + obj1.counter); System.out.println(" 객체 2 의 counter = " + obj2.counter); 객체 1 의 counter = 100 객체 2 의 counter = 200 5
예제 5. Television 생성자 public class Television { private int channel; // 채널번호 private int volume; // 볼륨 private boolean onoff; // 전원상태 // 생성자추가 void print() { System.out.println(" 채널은 " + channel + " 이고볼륨은 " + volume + " 입니다."); public class TelevisionTest { public static void main(string[] args) { Television mytv = new Television(7, 10, true); mytv.print(); Television yourtv = new Television(11, 20, true); yourtv.print(); 6
예제 6. Box 클래스 public class BoxTest { public static void main(string[] args) { Box b = new Box(20, 20, 30); System.out.println(" 상자의부피는 " + b.getvolume() + " 입니다 "); 상자의부피는 12000 입니다 7
예제 7. 안전한배열만들기 만약인덱스가배열의크기를벗어나게되면실행오류가발생한다. 따라서 실행오류를발생하지않는안전한배열을작성하여보자. 8
예제 7. 안전한배열만들기 public class SafeArrayTest { public static void main(string args[]) { SafeArray array = new SafeArray(3); for (int i = 0; i < (array.length + 1); i++) { array.put(i, i * 10); 잘못된인덱스 3 9
예제 7. 안전한배열만들기 public class SafeArray { private int a[]; public int length; public SafeArray(int size) { a = new int[size]; length = size; public int get(int index) { if (index >= 0 && index < length) { return a[index]; return -1; public void put(int index, int value) { if (index >= 0 && index < length) { a[index] = value; else System.out.println(" 잘못된인덱스 " + index); 10
생성자가없는클래스 vs. 생성자가있는클래스 생성자가없는클래스 public class Dummy { public class DummyTest { public static void main(string args[]) { Dummy obj = new Dummy(); 생성자가있는클래스 public class Dummy { public Dummy(int a) { public class DummyTest { public static void main(string args[]) { Dummy obj1 = new Dummy(); Dummy obj2 = new Dummy(1); 11
예제 8. 생성자오버로딩 public class Student { private int number; private String name; private int age; Student() { number = 100; name = "New Student"; age = 18; Student(int number, String name, int age) { this.number = number; this.name = name; this.age = age; @Override public String tostring() { return "Student [number=" + number + ", name=" + name + ", age=" + age + "]"; 12
예제 9. 날짜를나타내는 Date 클래스 13
예제 9. 날짜를나타내는 Date 클래스 public class DateTest { public static void main(string[] args) { Date date1 = new Date(2015, "8월", 10); Date date2 = new Date(2020); Date date3 = new Date(); System.out.println(date1); System.out.println(date2); System.out.println(date3); Date [year=2015, month=8 월, day=10] Date [year=2020, month=1 월, day=1] Date [year=1900, month=1 월, day=1] 14
예제 10. 시간를나타내는 Time 클래스 15
예제 10. 시간를나타내는 Time 클래스 public class TimeTest { public static void main(string args[]) { // Time 객체를생성하고초기화한다. Time time = new Time(); System.out.println(" 기본생성자호출후시간 : "+time.tostring()); // 두번째생성자호출 Time time2 = new Time(13, 27, 6); System.out.print(" 두번째생성자호출후시간 : "+time2.tostring()); // 올바르지않은시간으로설정해본다. Time time3 = new Time(99, 66, 77); System.out.print(" 올바르지않은시간설정후시간 : "+time3.tostring()); 기본생성자호출후시간 : 00:00:00 두번째생성자호출후시간 : 13:27:06 올바르지않은시간설정후시간 : 00:00:00 16
예제 11. 원을나타내는 Circle 클래스 17
예제 11. 원을나타내는 Circle 클래스 public class CircleTest { public static void main(string args[]) { Point p = new Point(25, 78); Circle c = new Circle(p, 10); System.out.println(c); Circle [radius=10, center=point [x=25, y=78]] 18
예제 12. 메소드로기초형변수가전달되는경우 기초형변수가전달되는경우 19
예제 12. 메소드로기초형변수가전달되는경우 public class MyCounter { int value; void inc(int a) { a = a + 1; public class MyCounterTest1 { public static void main(string args[]) { x = 10 MyCounter obj = new MyCounter(); int x = 10; obj.inc(x); System.out.println("x = " + x); 20
예제 13. 메소드로객체가전달되는경우 객체를메소드로전달하게되면객체가복사되어전달되는것이아니고참 조변수의값이복사되어서전달된다. 21
예제 13. 메소드로객체가전달되는경우 class MyCounter { int value = 0; void inc(mycounter ctr) { ctr.value = ctr.value + 1; public class MyCounterTest2 { public static void main(string args[]) { MyCounter obj = new MyCounter(); System.out.println("obj.value = " + obj.value); obj.inc(obj); System.out.println("obj.value = " + obj.value); obj.value = 0 obj.value = 1 22
예제 14. 메소드에서객체반환하기 public class Box { int width, length, height; int volume; Box(int w, int l, int h) { width = w; length = l; height = h; volume = w * l * h; // whoslargest 메소드구현하기 public class BoxTest { public static void main(string args[]) { Box obj1 = new Box(10, 20, 50); Box obj2 = new Box(10, 30, 30); Box largest = obj1.whoslargest(obj1, obj2); System.out.println("(" + largest.width + "," + largest.length + "," + largest.height + ")"); 23
예제 15. 같은크기의 Box 인지확인하기 2 개의박스가같은치수인지를확인하는메소드 issamebox() 를작성하여보 자. 만약박스의크기가같으면 true 를반환하고크기가다르면 false 를반환 한다. issamebox() 의매개변수는객체참조변수가된다. 24
예제 15. 같은크기의 Box 인지확인하기 public class Box { int width, length, height; Box(int w, int l, int h) { width = w; length = l; height = h; issamebox 메소드구현하기 public class BoxTest { public static void main(string args[]) { Box obj1 = new Box(10, 20, 50); Box obj2 = new Box(10, 20, 50); System.out.println("obj1 == obj2 : " + obj1.issamebox(obj2)); 25
예제 16. 정적변수예제 public class Car { private String model; private String color; private int speed; // 자동차의시리얼번호 private int id; private static int numbers = 0; public Car(String m, String c, int s) { model = m; color = c; speed = s; // 자동차의개수를증가하고 id 에대입한다. id = ++numbers; 26
예제 16. 정적변수예제 public class CarTest { public static void main(string args[]) { Car c1 = new Car("S600", white, 80); // 첫번째생성자호출 Car c2 = new Car("E500", blue, 20); // 첫번째생성자호출 int n = Car.numbers; // 정적변수 System.out.println(" 지금까지생성된자동차수 = " + n); 지금까지생성된자동차수 = 2 27
예제 17. 정적메소드예제 public class Car { private String model; private String color; private int speed; // 자동차의시리얼번호 private int id; // 실체화된 Car 객체의개수를위한정적변수 private static int numbers = 0; public Car(String m, String c, int s) { model = m; color = c; speed = s; // 자동차의개수를증가하고 id에대입한다. id = ++numbers; // 정적메소드 public static int getnumberofcars() { return numbers; // OK! 28
예제 17. 정적메소드예제 public class CarTest { public static void main(string args[]) { Car c1 = new Car("S600", white, 80); // 첫번째생성자호출 Car c2 = new Car("E500", blue, 20); // 첫번째생성자호출 int n = Car.getNumberOfCars(); // 정적메소드호출 System.out.println(" 지금까지생성된자동차수 = " + n); 지금까지생성된자동차수 = 2 29
예제 18. 직원클래스작성하기 직원을나타내는클래스에서직원들의수를카운트하는예를살펴보자. 직 원의수를정적변수로나타낸다. 객체가하나씩생성될때마다생성자에서 정적변수 count 를증가한다. 30
예제 18. 직원클래스작성하기 public class Employee { private String name; private double salary; private static int count = 0; // 정적변수 // 생성자 public Employee(String n, double s) { name = n; salary = s; count++; // 정적변수인 count를증가 // 객체가소멸될때호출된다. protected void finalize() { count--; // 직원이하나줄어드는것이므로 count를하나감소 // 정적메소드 public static int getcount() { return count; 31
예제 18. 직원클래스작성하기 public class EmployeeTest { public static void main(string[] args) { Employee e1, e2, e3; e1 = new Employee(" 김철수 ", 35000); e2 = new Employee(" 최수철 ", 50000); e3 = new Employee(" 김철호 ", 20000); int n = Employee.getCount(); System.out.println(" 현재의직원수 =" + n); 현재의직원수 =3 32
예제 19. 내부클래스 게임에서캐릭터가여러가지아이템을가지고있다. 이것을코드로구현하 여보자. 아이템은캐릭터만사용한다고가정하자. 그러면캐릭터를나타내 는클래스안에아이템을내부클래스로정의할수있다. 33
예제 19. 내부클래스 import java.util.arraylist; public class GameCharacter { private class GameItem { String name; int type; int price; int getprice() { return price; @Override public String tostring() { return "GameItem [name=" + name + ", type=" + type + ", price=" + price + "]"; 34
예제 19. 내부클래스 private ArrayList<GameItem> list = new ArrayList<>(); public void add(string name, int type, int price) { GameItem item = new GameItem(); item.name = name; item.type = type; item.price = price; list.add(item); public void print() { int total = 0; for (GameItem item : list) { System.out.println(item); total += item.getprice(); System.out.println(total); 35
예제 19. 내부클래스 public class GameChracterTest { public static void main(string[] args) { GameCharacter charac = new GameCharacter(); charac.add("sword", 1, 100); charac.add("gun", 2, 50); charac.print(); GameItem [name=sword, type=1, price=100] GameItem [name=gun, type=2, price=50] 150 36