[배열] 국비 40일차

포키·2022년 11월 16일
0

국비과정

목록 보기
27/73

찾아볼 것
1. 인터페이스 다중상속의 의미
: 어떨 때 사용? 왜 사용?

api문서에서 specified ~ (특정한 객체)가 나오면 무조건 parameter를 가리킴.


equals 메서드 (객체비교 메서드)

	eqauls (other : Object) : boolean
  • toString처럼 오버라이딩하여 사용 (from Object)
	// Object에 존재하는 메서드 (기본 연산은 '주소 비교(객체 동일여부 체크)')
	public boolean equals(Object other) {
    	return this == other;
    }
  • 객체를 구성하는 정보가 유사할 때 = 멤버변수가 같을 때, 두 객체가 같다고 말할 수 있다.

  • 객체가 같은지 다른지를 결정하는 기준은 모두 다르다
    -> 객체가 같다고 판정하는 기준은 객체를 만든 사람(설계한 사람)이 결정한다.

    객체 변수 간의 == 연산은 두 변수가 담고있는 주소값이 같을 때만 (같은 객체를 가리킬 때만) true를 반환한다.

  • 작성하는 법 (작성 순서)

  1. '자료형(클래스)이 다른 경우', 'null이 들어오는 경우' 제외
  2. 형변환 : Object other를 해당 클래스로 변환
  3. 기준이 되는 멤버변수 값을 비교
	@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
	}
}

equals 연습 - Human 클래스

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를 사용해야 한다

배열 (of Java!)

  1. 복수 data -> 동일 type
  • 기본적으로는 변수 하나당 값 하나가 규칙 (1:1)
  • 배열은 같은 종류의 여러 개의 값(원소)에 이름을 하나만 붙여 부르는 것 (1:N)
  1. index로 원소 식별 (zero based : 0부터 시작)
  2. 길이(length) - 원소의 개수 <- 생성시 결정되고 이후 변경 불가!!
  3. 배열은 객체다

배열을 나타내는 클래스는 없다. 기능도 없다. api에 작성되지도 않았다.
배열을 통해 접근할 수 있는 정보는 오직 length뿐. (배열명.length로 접근)

  • 배열의 length는 변하지 않는데 왜 상수(LENGTH)로 적히지 않는가?
    c언어에서 넘어온 흔적(으로 추측)

배열은 생성자로 생성하지 않는다. (생성자 없이 생성한다)

배열의 생성

💘 배열을 생성할 때 꼭 필요한 정보
1. 배열 길이 (length)
2. 원소 타입 (어떤 type의 데이터가 들어가는지)
(원소로 배열이 들어갈 때, 길이를 정해줄 필요는 없다!
타입만 결정하면 되는거지, 객체를 꼭 생성해서 바로 넣어줄 필요는 없기 때문.)

  1. 자료형[] 배열이름 = 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;
  1. int[] arr = {3, 4, 5};
    실제로 많이 쓰지 않음.
    선언과 정의가 함께 이루어져야 하기에
    배열의 모든 값을 배열 생성시부터 알고 있어야 한다는 한계점

  2. int[] arr = new int[] {3, 4, 5};
    원소가 몇 개 없는데 이름이 없이 사용할 때 (재사용하지 않을 일회용 배열)

int[] : int형 변수를 담는 배열
boolean[] : boolean형 변수를 담는 배열

배열과 반복문 (for문)

  • 배열과 for문은 궁합이 좋다.
  • 배열과 반복문을 이용하는 것으로 반복 작업을 확 줄일 수 있다 :
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);
		}
	}
}

Arrays 클래스 (import java.util.*)

배열은 클래스가 없다. 따라서 배열을 다루기 위한 메서드도 배열 객체 안에 존재하지 않는다.
그렇기 때문에 배열을 다루기 위한 메서드를 담은 static 클래스가 존재한다. = Arrays 클래스
말하자면 배열의 도우미 클래스

toString(배열) 메서드

배열의 요소를 모두 출력하여 주는 메서드
Object의 toString과 달리 static메서드이며 패러미터를 필요로 한다.

public static class Arrays {
	public static String toString(int[] a) {
    ... }
}

binarySearch(char[] a, char key) 메서드

  • 반씩 나누어 필요한 자료를 찾아감
  • 배열은 반드시 정렬되어 있어야 한다. (The array must be sorted.)
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 + "입니다.");
	}
}

가변길이인자 (variable length arguments)

  • JDK 1.5부터 사용 가능
  1. 가변길이인자는 메서드에 1개만 사용할 수 있다. (경계가 구분 안됨)
  2. 일반 파라미터와 혼용 가능. (당연히 일반 파라미터 생략 불가)
  3. 가변길이 인자는 마지막 파라미터여야 한다.
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});
	}
}
profile
welcome

0개의 댓글