찾아볼 것
1. 인터페이스 다중상속의 의미
: 어떨 때 사용? 왜 사용?
api문서에서 specified ~ (특정한 객체)가 나오면 무조건 parameter를 가리킴.
eqauls (other : Object) : boolean
// Object에 존재하는 메서드 (기본 연산은 '주소 비교(객체 동일여부 체크)')
public boolean equals(Object other) {
return this == other;
}
객체를 구성하는 정보가 유사할 때 = 멤버변수가 같을 때, 두 객체가 같다고 말할 수 있다.
객체가 같은지 다른지를 결정하는 기준은 모두 다르다
-> 객체가 같다고 판정하는 기준은 객체를 만든 사람(설계한 사람)이 결정한다.
객체 변수 간의
==
연산은 두 변수가 담고있는 주소값이 같을 때만 (같은 객체를 가리킬 때만)true
를 반환한다.
작성하는 법 (작성 순서)
null
이 들어오는 경우' 제외Object other
를 해당 클래스로 변환 @Override
public boolean equals(Object other) {
if(other == null || !(other instanceof 클래스명)) {
return false; // null이거나 아예 다른 클래스면 무조건 false 반환
}
// 이 아래에서 멤버변수 비교
}
class Ball {
private int num;
private double weight;
public Ball(int num, double weight) {
setNum(num);
setWeight(weight);
}
public int getNum() {
return num;
}
public double getWeight() {
return weight;
}
public void setNum(int num) {
this.num = num;
}
public void setWeight(double weight) {
this.weight = weight;
}
// 공의 번호가 같으면 같은 공이다.
@Override
public boolean equals(Object other) {
// 1. other가 null일 때
// 2. other가 Ball 객체가 아닐 때
// 무조건 false
if(other == null || !(other instanceof Ball)) {
return false;
}
Ball temp = (Ball) other;
return num == temp.getNum() && weight == temp.getWeight();
}
}
class Ex1 {
public static void main(String[] args) {
Ball b1 = new Ball(3, 150.5);
Ball b2 = new Ball(4, 150.5);
Ball b3 = new Ball(3, 160.8);
Ball b4 = new Ball(3, 150.5);
System.out.println(b1.equals(b2)); // false
System.out.println(b1.equals(b3)); // false
System.out.println(b1.equals(b4)); // true
}
}
class Human {
private String name;
private int age;
private String addr;
public Human(String name, int age, String addr) {
setName(name);
setAge(age);
setAddr(addr);
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getAddr() {
return addr;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setAddr(String addr) {
this.addr = addr;
}
@Override
public boolean equals(Object other) {
if(other == null || !(other instanceof Human)) {
return false;
}
Human temp = (Human) other;
return name.equals(temp.getName()) && age == temp.getAge() && addr.equals(temp.getAddr());
}
@Override
public String toString() {
return name + "/" + age + "/" + addr + "\n";
}
}
class Ex3 {
public static void main(String[] args) {
Human h1 = new Human("철수", 10, "서울");
Human h2 = new Human("영희", 10, "부산");
System.out.println(h1.equals(h2));
System.out.println(h1.equals(new Human("영희", 10, "서울")));
System.out.println(h1.equals(new Human("철수", 10, "서울")));
System.out.println(h1.equals(new Human(new String("철수"), 10, "서울")));
}
}
문자열(=String 클래스의 객체)을 비교할 때는 반드시 equals를 사용해야 한다
배열을 나타내는 클래스는 없다. 기능도 없다. api에 작성되지도 않았다.
배열을 통해 접근할 수 있는 정보는 오직length
뿐. (배열명.length
로 접근)
- 배열의 length는 변하지 않는데 왜 상수(LENGTH)로 적히지 않는가?
c언어에서 넘어온 흔적(으로 추측)
배열은 생성자로 생성하지 않는다. (생성자 없이 생성한다)
💘 배열을 생성할 때 꼭 필요한 정보
1. 배열 길이 (length)
2. 원소 타입 (어떤 type의 데이터가 들어가는지)
(원소로 배열이 들어갈 때, 길이를 정해줄 필요는 없다!
타입만 결정하면 되는거지, 객체를 꼭 생성해서 바로 넣어줄 필요는 없기 때문.)
자료형[] 배열이름 = new 자료형[length];
배열이름[index] = data;
int arr[] = new int[3]; // c, c++ 방식, 가능하지만 자바에서 잘 쓰지 않음
int[] arr = new int[3];
arr[0] = 3;
arr[1] = 4;
arr[2] = 5;
int[] arr = {3, 4, 5};
실제로 많이 쓰지 않음.
선언과 정의가 함께 이루어져야 하기에
배열의 모든 값을 배열 생성시부터 알고 있어야 한다는 한계점
int[] arr = new int[] {3, 4, 5};
원소가 몇 개 없는데 이름이 없이 사용할 때 (재사용하지 않을 일회용 배열)
int[]
: int형 변수를 담는 배열
boolean[]
: boolean형 변수를 담는 배열
class Ex4 {
public static void main(String[] args) {
// 0 1 2 3 4
int[] arr = {3, 6, 8, 2, 5};
// int타입 배열 -> for문과 궁합이 좋다.
// 정순 : index 0 ~ 4까지 차례로 꺼냄
for(int i=0; i<arr.length; i++) {
// i : 0 ~ 4
System.out.println(arr[i]);
}
// 역순 : index 4 ~ 0까지 역순으로 꺼냄
for(int i=arr.length-1; i>=0; i--) {
// i : 4 ~ 0
System.out.println(arr[i]);
}
}
}
JDK 1.5부터 더 간편한 for문을 지원한다 : for(type 원소 : 배열명)
class Ex4 {
public static void main(String[] args) {
// 0 1 2 3 4
int[] arr = {3, 6, 8, 2, 5};
// int타입 배열 -> for문과 궁합이 좋다.
// JDK1.5~ 간편한 for문 : index를 이용하지 않음
// 한계 1. 접근하는 방향, 규칙 변경 불가 (무조건 0부터 끝까지)
// 2. 대입 연산 불가
for(int n : arr) {
// int타입 배열 -> 배열의 값을 꺼내어 담을 변수 n 또한 int여야 함
System.out.println(n);
}
}
}
배열은 클래스가 없다. 따라서 배열을 다루기 위한 메서드도 배열 객체 안에 존재하지 않는다.
그렇기 때문에 배열을 다루기 위한 메서드를 담은 static 클래스가 존재한다. = Arrays
클래스
말하자면 배열의 도우미 클래스
배열의 요소를 모두 출력하여 주는 메서드
Object의 toString과 달리 static메서드이며 패러미터를 필요로 한다.
public static class Arrays {
public static String toString(int[] a) {
... }
}
public static void main(String[] args) { ... }
- main 메서드의 패러미터
String[] args
의 의미
원래 자바를 실행할 때 명령프롬프트를 이용해 코드 바깥에서 main 메서드의 패러미터를 따로 넣는 것이 가능했다.
이때 바깥에서 들어오는 패러미터는 다양할 수 있으므로 (0개~무한개), 이를 커버하기 위해 패러미터 자리에 배열을 사용했다.
class Result {
public int resultOfSum;
public int resultOfMinus;
public Result(int resultOfSum, int resultOfMinus) {
this.resultOfSum = resultOfSum;
this.resultOfMinus = resultOfMinus;
}
@Override
public String toString() {
return "합: " + resultOfSum + ", 차: " + resultOfMinus + "\n";
}
}
class Ex7 {
// Q1. 주어진 수들을 합하는 메서드 만들기
// 1번 방법 : overloading 사용하기 (여러 메서드 만들기)
// 정수 2개를 합하는 메서드 만들고
public static void printSum(int num1, int num2) {
System.out.println(num1 + num2);
}
// 정수 3개를 합하는 메서드 만들기
public static void printSum(int num1, int num2, int num3) {
System.out.println(num1 + num2);
}
// 2번 방법 : 패러미터를 배열로 받는 메서드 만들기 -> 여러 개의 데이터를 '개수 제한 없이' 자유롭게 받아올 수 있다!
public static void ultraPrintSum(int[] nums) {
int sum = 0;
for(int num : nums) {
sum += num;
}
System.out.println(sum);
}
// Q2. 여러 개의 데이터를 한 번에 반환하는 법
// 1번 방법 : return을 배열로 받아오기
// (배열 인덱스에 이름 붙이기 ('public static final int' 사용) <- 다소 번거로운 점ㅠ)
public static int[] getPlusAndMinus(int num1, int num2) {
return new int[] {num1 + num2, num1 - num2};
}
public static final int RESULT_OF_SUM = 0;
public static final int RESULT_OF_MINUS = 1;
// 2번 방법 : return을 클래스로 받아오기
// 클래스를 따로 만들어야 하는 번거로움이 있으나, 인덱스에 이름 붙이고 할 필요는 없다.
public static Result getUltraPlusAndMinus(int num1, int num2) {
return new Result(num1 + num2, num1 - num2);
}
public static void main(String[] args) {
ultraPrintSum(new int[] {1, 2, 3});
ultraPrintSum(new int[] {1, 2, 3, 4, 5, 6, 7});
ultraPrintSum(new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
ultraPrintSum(new int[] {});
int[] arr = getPlusAndMinus(10, 3);
System.out.println(arr[RESULT_OF_SUM]);
System.out.println(arr[RESULT_OF_MINUS]);
System.out.println(getUltraPlusAndMinus(10, 3));
}
}
import java.util.Scanner;
public class ArrayTest4 {
public static void main(String[] args) {
int total = 0;
int size;
Scanner scan = new Scanner(System.in);
System.out.print("배열의 크기를 입력하시오: ");
size = scan.nextInt();
int[] scores = new int[size];
for (int i = 0; i < scores.length; i++) {
System.out.print("성적을 입력하시오: ");
scores[i] = scan.nextInt();
}
for (int i = 0; i < scores.length; i++) {
total += scores[i];
}
System.out.println("평균 성적은 " + total / scores.length + "입니다.");
}
}
import java.util.Scanner;
public class ArrayTest5 {
public final static int STUDENTS = 5;
public static void main(String[] args) {
int[] scores = new int[STUDENTS];
getValues(scores);
getAverage(scores);
}
private static void getValues(int[] array) {
Scanner scan = new Scanner(System.in);
for (int i = 0; i < array.length; i++) {
System.out.print("성적을 입력하시오: ");
array[i] = scan.nextInt();
}
}
private static void getAverage(int[] array) {
int total = 0;
for (int i = 0; i < array.length; i++) {
total += array[i];
}
System.out.println("평균 성적은 " + total / array.length + "입니다.");
}
}
class Ex8 {
public static void printSum(int[] nums) {
// 배열을 만들어서 넣어야 함 : new int[] {1, 2, 3...}
int sum = 0;
for(int num : nums) {
sum += num;
}
System.out.println(sum);
}
// JDK1.5~ : variable length arguments (가변인자) : VALARG
public static void todo(String str, double dNum, int... nums){
}
public static void superUltraPrintSum(int... nums) {
// 알아서 배열로 만들어서 넣어줌 : 1, 2, 3...
printSum(nums);
}
public static void main(String[] args) {
todo("abc", 3.14);
superUltraPrintSum();
superUltraPrintSum(1);
superUltraPrintSum(1, 2, 3);
superUltraPrintSum(new int[] {1, 2, 3});
}
}