- 유저가 자료를 임의로 입력할때 setter 를 이용하여 클래스 자료형 배열에 객체를 저장.
- 클래스 자료형 배열 내에 getter를 이용하여 객체n번째에 저장된 자료를 출력
클래스, 객체, 인스턴스
1. 클래스의 객체에 원본 정의서.
2. 객체(instance)는 클래스가 실행되서 메모리에 적재된 상태를 말함. 클래스(원본) -> 객체1 -> 독립적인 상태 유지 -> 소멸 -> 가비지 컬렉터 -> 객체2 -> 독립적인 상태 유지 -> 소멸 -> 가비지 컬렉터 -> 객체3 -> 독립적인 상태 유지 -> 소멸 -> 가비지 컬렉터
/* public int m500(int data) { int result = 0; result = data / 500; return result; } public int m100(int data) { int result = 0; result = data / 100; return result; } public int m50(int data) { int result = 0; result = data / 50; return result; } public int m10(int data) { int result = 0; result = data / 10; return result; }*/
public int moneyChange(int data, int unit) { int result = 0; result = data / unit; return result; } }
//Class03.java (main()메소드가 있는 클래스)
package com.test; import java.util.*;
public class Class03 { public static void main(String[] args) {
//입력 Scanner sc = new Scanner(System.in); System.out.print("금액(10~1000)?"); int money = sc.nextInt(); int data = money;
//특정 숫자를 반복해서 곱하기 연산하는 메소드 구현 public int sqrt(int data, int digit) { int result = 1; for (int a=1; a<=digit; a++) { result *= data; //1*10*10*10*... } return result; }
//특정 자리의 수를 리턴하는 메소드 구현 public int number(int data, int digit) { int result = 0; result = data / digit; //정수 / 정수 -> 몫 return result; } }
//Class04.java(main()메소드가 있는 클래스)
package com.test; import java.util.Scanner;
public class Class04 { public static void main(String[] args) {
//입력 Scanner sc = new Scanner(System.in); System.out.print("숫자 입력(2자리 이상)?"); String num = sc.next(); //문자열 형태로 입력 받는다.
//처리 int size = num.length(); //문자열 길이를 리턴. Calc obj = new Calc(); int digit = obj.sqrt(10, size-1); //10, 100, 1000, 10000, ... 등의 값 리턴. int data = Integer.parseInt(num); int[] arr = new int[size]; for (int a=0; a<arr.length; a++) { //1234, 1000 -> 1 -> a[0] //234, 100 -> 2 -> a[1] //34, 10 -> 3 -> a[2] //4, 1 -> 4 -> a[3] arr[a] = obj.number(data, digit); data%=digit; digit/=10; }
int sum = 0; for (int a=0; a<arr.length; a++) { sum += arr[a]; }
문제) 2자리 이상의 수를 입력 받아서 자릿수들의 합을 계산해서 출력. 클래스 이용. 문자열을 한 글자씩 분리하는 방법으로 해결 실행 예) 숫자 입력(2자리 이상)?1234 1000자리의 수 -> 1 100자리의 수 -> 2 10자리의 수 -> 3 1자리의 수 -> 4 자릿수의 합 : 10
//Calc.java (사용자 정의 클래스)
package com.test; public class Calc {
//특정 숫자를 반복해서 곱하기 연산하는 메소드 구현 public int sqrt(int data, int digit) { int result = 1; for (int a=1; a<=digit; a++) { result *= data; //1*10*10*10*... } return result; }
//특정 자리의 수를 리턴하는 메소드 구현 public int number(int data, int digit) { int result = 0; result = data / digit; //정수 / 정수 -> 몫 return result; } }
//Class05.java
package com.test; import java.util.Scanner;
public class Class05 { public static void main(String[] args) {
//입력 Scanner sc = new Scanner(System.in); System.out.print("숫자 입력(2자리 이상)?"); String num = sc.next(); //문자열 형태로 입력 받는다.
//처리 int size = num.length(); //문자열 길이를 리턴. Calc obj = new Calc(); int[] arr = new int[size]; for (int a=0; a<arr.length; a++) { // 문자열에서 substring(첫순서, 마지막순서) 기본지원 메소드를 이용해 하나씩 떼와서 // Integer 클래스로 형변환 한 후 배열에 넣는다. arr[a] = Integer.parseInt(num.substring(a, a+1)); }
int sum = 0; for (int a=0; a<arr.length; a++) { sum += arr[a]; }
문제) 세 개의 숫자 중에서 가장 큰 숫자 구하기. 사용자 정의 클래스 이용. sort() 메소드 금지 실행 예) 숫자1? X 숫자2? Y 숫자3? Z 입력 받은 숫자: X, Y, Z가장 큰 숫자: X
//Calc.java (사용자 정의 클래스)
package com.test; public class Calc {
//세개의 숫자중 가장 큰 숫자를 리턴하는 메소드 구현 public int max(int num1, int num2, int num3) { int result = 0; int data = (num1 >= num2)? num1 : num2; result = (data >= num3)? data : num3; return result; } }
//Class06.java (main()메소드 포함 클래스)
package com.test; import java.util.*;
public class Class06 { public static void main(String[] args) {
//입력 Scanner sc = new Scanner(System.in); System.out.print("숫자1? "); int num1 = sc.nextInt(); System.out.print("숫자2? "); int num2 = sc.nextInt(); System.out.print("숫자3? "); int num3 = sc.nextInt();
//처리 Calc obj = new Calc(); int max = obj.max(num1, num2, num3);
//출력 System.out.printf("입력 받은 숫자: %d, %d, %d%n", num1, num2, num3); System.out.printf("가장 큰 숫자: %d", max); } }
문제) 여러 개의 숫자 중에서 가장 큰 숫자 구하기. 배열 및 사용자 정의 클래스 이용. sort() 메소드 금지 실행 예) 입력할 숫자의 갯수 지정(2~10)? 숫자1? X 숫자2? Y 숫자3? Z ... 입력 받은 숫자: X, Y, Z, ..... 가장 큰 숫자: X
//Calc.java (사용자 정의 클래스)
package com.test; public class Calc {
//여러개의 숫자(배열1개가져옴)중 가장 큰 숫자를 리턴하는 메소드 구현 public int maxArray(int[] arr) { int result = 0; int temp = 0; for(int a=0; a<arr.length-1; a++){ if (arr[a] >= arr[a+1]) { temp = arr[a]; arr[a] = arr[a+1]; arr[a+1] = temp; } } result = arr[arr.length-1]; return result; } }
//Class07
package com.test; import java.util.*;
public class Class07 { public static void main(String[] args) {
//입력 Scanner sc = new Scanner(System.in); System.out.print("입력할 숫자의 갯수 지정(2~10)?"); int size = sc.nextInt();
//배열 생성 int[] arr = new int[size];
//생성된 배열에 각 숫자를 넣기 for (int a=0; a<arr.length; a++) { System.out.printf("숫자%d?", a+1); arr[a] = sc.nextInt(); }
//처리 Calc obj = new Calc(); int max = obj.maxArray(arr);
//출력 System.out.print("입력 받은 숫자: "); for (int a=0; a<arr.length; a++) { if (a == arr.length-1) { System.out.printf("%d%n", arr[a]); } else { System.out.printf("%d ,", arr[a]); } } System.out.printf("가장 큰 숫자: %d", max); } }
접근 지정자
1. public, private, protected, default(표시하지 않는 상태)
4. public 지정시 -> 어떤 위치에서든지 접근 가능. private 지정시 -> 해당 영역 안에서만 접근 가능. protected 지정시 -> 상속 관계가 있는 클래스에서만 접근 가능. default 지정시(아무것도 안썼을때) -> 같은 패키지 내에서만 접근 가능.
Class08_02 -> [각주:1](같은 패키지에 소속되어 있는 상태) Class08_3 -> [각주:2](다른 패키지에 소속되어 있는 상태) Class08_4 -> [각주:3](다른 패키지에 소속되어 있는 상태)
package com.test; import com.exam.Class08_4; // 다른 패키지에 있는 클래스를 import 구문으로 인식시킴.
public class Class08_1 { public static void main(String[] args) {
//다른 클래스에 존재하는 멤버 접근 //-> 해당 클래스의 객체 생성 과정 필요 //-> 해당 멤버 접근 시도 //-> 접근지정자가 public이 아니면 접근 불가 Class08_2 obj = new Class08_2(); obj.method1(); //성공 obj.method2(); //성공 // obj.method3(); //실패
//다른 패키지에 있는 다른 클래스의 멤버 접근 //->다른 패키지에 있는 경우는 클래스의 소속(패키지명) 확인. //-> 해당 클래스의 객체 생성 과정 필요 //-> 해당 멤버 접근 시도 //-> 접근지정자가 public이 아니면 접근 불가 com.sample.Class08_3 test = new com.sample.Class08_3(); test.method1(); //성공 //test.method2(); //실패 //test.method3(); //실패
//다른 패키지에 있는 다른 클래스의 멤버 접근 //-> 다른 패키지에 있는 클래스를 자주 참조한다면 //해당 패키지명을 import 구문에 표시 //-> import 구문 자동 추가 Ctrl+Shift+M Class08_4 exam = new Class08_4(); exam.method1(); //성공 //exam.method2(); //실패 //exam.method3(); //실패 exam.method4(); //성공 -> method3() 호출역할 } }
이름과 전화번호를 저장할 수 있는 자료형 만들기 실행 예) 회원 수(1~10)?3 이름 전화번호(1)? hong 111-1111 이름 전화번호(2)? kim 222-2222 이름 전화번호(3)? park 333-3333 ---------------- 전체 회원수: 3명 ---------------- 이름 전화번호 hong 111-1111 kim 222-2222 park 333-3333 ----------------
//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; } }
//Class11.java (main() 메소드 포함 클래스)
package com.test;
import java.util.*;
public class Class11 { public static void main(String[] args) {
//입력 Scanner sc = new Scanner(System.in); System.out.print("회원수 입력(1~10)?"); String num = sc.next(); int count = Integer.parseInt(num);
//이름및 전화번호 자료형 클래스 활성화 및 저장용 배열 생성 //아래에서 사용된 Member는 사용자 정의 클래스 자료형(참조형)을 의미한다. //배열의 자료형 선언은 String, int, 참조형등 여러 자료형 선언이 가능하고, //배열 자체가 for문등 사용자 임의의 수를 기반으로 데이터를 운용하기에 //매우 적합하기 때문에 이 예제에서 클래스 자료형 배열을 생성한 것이다.
Member[] members = new Member[count]; // 사용자 정의 클래스 자료형인 배열을 생성
//처리
for (int a=0; a<members.length; a++) { System.out.printf("이름:전화번호(%d)?", (a+1)); String name = sc.next(); //이름 String tel = sc.next(); //전화번호
Member member = new Member(); // member 객체 생성 과정 member.setName(name); //member 객체에 이름 저장(바로 윗줄에서 생성한 객체이름) member.setTel(tel); //member 객체에 전화번호 저장 members[a] = member; //member 객체를 배열에 저장하는 과정
//members[a]는 Member 객체를 리턴할 뿐이다. //name, tel 접근을 하려면 Member 객체에서 gerName(), gerTel()을 이용해야 한다. // System.out.printf("%s %s %n", members[a]); 일케하면 members[a]는 자동으로 이름과 전화번호를 뿌려주지 않는다.
//캐스트 연산자 Member 유의. 추후 캐스트 연산자를 이런식으로 사용할 수 있는 케이스가 있다. //현재 예제에서는 캐스트 연산자를 사용하지 않아도 된다.
//members[a] 에는 name 과 tel 이라는 두 저장공간이 있다. //출력단에서 출력할때에 members[a]라고만 기재할 경우 출력되지 않으며, //(배열명).사용자정의클래스내메소드명() 형식으로 기재해야한다. //즉, (members[a]).getName() System.out.printf("%s %s %n", ((Member)members[a]).getName(), ((Member)members[a]).getTel()); }