본문 바로가기

Skill Tree🌲/coding_package

Java 웹개발자 과정 5일차 - 약간의 메소드, 배열

String.class에 equals기능을 보자.

public boolean equals(Object anObject) {
	if (this == anObject) {
		return true;
	}
	return (anObject instanceof String aString)
			&& (!COMPACT_STRINGS || this.coder == aString.coder)
			&& StringLatin1.equals(value, aString.value);
}

맨 윗부분을 메소드 선언부라고 하고,  public boolean equals (Object anObject) 이렇게 4정보로 이루어져 있다.

밑의 수행문은 메소드 구현부라고 한다.

 

우리는 main이라는 메소드의 구현부를 코딩하고 있었다. 참고로 JVM은 main이라는 메소드만 실행한다.

 

제일 중요한 메소드의 선언부를 먼저 파악해야한다. 선언부는 사용하기 위한 정보가 들어있는데, 정보를 파악하는 것만으로도 메소드를 사용하는데 아무 문제가 없다. 


메소드
  • 이름이 있는 코드블록이다.
  • 메소드는 선언부와 구현부로 구성된다.
  • 메소드의 선언부 = 접근제한자 반환타입 메소드이름(파라미터)
  • 메소드의 구현부는 여는 괄호와 닫는 괄호로 정의되고, 해당 블록 내에 수행문을 포함할 수 있다. 수행문이 하나도 없어도 상관없다.
  • 객체가 가지고 있는 메소드를 사용할 때는 메소드의 선언부를 확인해보면 사용법을 파악할 수 있다.

메소드 선언부의 구성요소
  • 접근제한자 : 메소드의 공개범위를 지정한다.

public, protected, private가 있다. 주로 public과 private를 많이 쓴다.

public의 공개범위는 전체 공개, private의 공개범위는 비공개다.

 

  • 반환타입 : 메소드 구현부의 실행이 완료되면 획득하게 되는 데이터의 타입을 지정한다.

메소드가 반환하는 값이 없으면 반환타입은 void다. (void, 넌 아무것도 못 얻게 돼, 반환값이 없다.)

그 외는 전부 메소드 실행 후 반환타입에서 지정한 타입의 값을 반환한다.

 

  • 메소드이름 : 다른 메소드와 구별되는 이름이다.

메소드를 실행할 때는 메소드의 이름으로 그 메소드를 실행한다.

 

  • 파라미터 : 메소드 실행에 필요한 값의 정보를 정의한다.

파라미터는 하나도 없을 수도 있고, 여러 개 있을 수도 있다.

각각의 파라미터매개변수타입 매개변수명으로 구성된다.

메소드이름(매개변수타입 매개변수명, 매개변수타입 매개변수명)

메소드의 실행
클래스명 참조변수 = new 클래스명( );
실행할 메소드를 보유하고 있는 클래스(설계도)로 객체를 생성(new)하고, 생성된 객체를 참조할 참조변수를 선언해서, 그 객체의 주소값을 대입받는다.

참조변수.메소드이름( );
public void 이름( ) { ... }

참조변수.메소드이름(값);
public void 이름(타입 변수명) { ... }

참조변수.메소드이름(값1, 값2);
public void 이름(타입 변수명, 타입 변수명) { ... }

boolean 변수 = 참조변수.메소드이름( )
public boolean 이름( ) { .. }

int 변수 = 참조변수.메소드이름( )
public int 이름( ) { ... }

String 변수 = 참조변수.메소드이름(값)
public String 이름(타입 변수명) {...}


Scanner 클래스에 정의된 메소드 실행해보기
public class Scanner {
	
    // 키보드 입력을 읽어서 문자열을 반환한다.
    public String next() {...}
    
    // 키보드 입력을 읽어서 정수를 반환한다.
    public Int nextInt() {...}
    public long nextLong() {...}
    public double nextDouble() {...}
    
}

 

1. 객체 생성

Scanner sc = new Scanner(System.in);

 

2. 메소드 실행

System.out.println("이름을 입력하세요: ");
String name = sc.next();
// Scanner 클래스에 정의된 메소드 중에서 문자열을 획득할 수 있는 메소드를 선택해서 실행함

System.out.println("구매수량을 입력하세요: ");
int quantity = sc.nextInt();
// Scanner 클래스에 정의된 메소드 중에서 정수를 획득할 수 있는 메소드를 선택해서 실행함

String 클래스에 정의된 메소드 실행하기
public class String {

    // 문자열의 길이를 반환한다.
    public int length() {...}
    
    // 문자열에 지정된 텍스트가 포함되어있는지 여부를 반환한다.
    public boolean contains(String text) {...}
    
    // 문자열이 빈 문자열인지 여부를 반환한다.
    public boolean isEmpty() {...}
    
    // 문자열과 지정된 텍스트가 내용이 동일한지 여부를 반환한다.
    public boolean equals(Object text) {...}
    
    // 문자열에서 지정된 시작위치부터 문자열의 끝에 해당하는 문자열과 동일한 문자열을 반환한다.
    public String substring(int beginIndex) {...}
    
    // 문자열에서 지정된 구간에 해당하는 문자열과 동일한 문자열을 반환한다.
    public String substring(int beginIndex, int endIndex) {...}
    
}

 

1. 객체 생성

String s = "체다치즈의 블로그 입니다";
원문장 : String s = new String("체다치즈의 블로그 입니다");

2. 메소드 실행

s.length( );                   // 실행값 : 35
s.contains("블로그");     // 실행값 : true
s.equals("dddd");         // 실행값 : false

String 클래스에 정의된 메소드 실행하기


if문에서 문자열 비교, 출력해보기

if는 boolean타입이 조건이어야 해서, grade. 찍으면 자동완성으로 boolean 반환타입의 property가 쭉 나온다.

 

  • equals와 equalsIgnoreCase 의 차이

equals 는 대소문자를 구분하고, equalsIgnoreCase는 대소문자를 무시한다.

 

  • nextInt( )와 nextInt(int radix)의 차이

System.out.println("숫자를 10진법 입력하세요:");   //입력 : 20
int a = sc.nextInt();
System.out.println(a);   // 출력 : 20

System.out.println("숫자를 2진법 입력하세요:");   // 입력 : 110
int a = sc.nextInt(2) // 2진법으로 읽어들이겠다. 안적으면 10진법
System.out.println(a);   // 출력 : 6

 

Java 웹개발자 과정 4일차 과정 - switch문, for문, 이중for문, Scanner

 

Java 웹개발자 과정 4일차 과정 - switch문, for문, 이중for문, Scanner

switch문 switch(연산식 혹은 값) {  case 값1: 수행문1;   수행문1;   break;  case 값2:   수행문2;   수행문2;   break;  default:   수행문3;   수행문4; } 연산식 혹은 값이 값1과 일치하면..

cheddar-cheez.tistory.com

여기에서 나온 마지막 코드 if를 사용해서 다시 코딩하면?

더보기
import java.util.Scanner;

public class App5 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		System.out.print("고객 이름을 입력하세요: ");
		String name = sc.next();
		
		System.out.print("고객 등급을 입력하세요: ");
		String grade = sc.next();
		
		System.out.print("구매 금액을 입력하세요: ");
		int orderPrice = sc.nextInt();
		
		int point = 0;
        if(grade.equals("골드")) {
			point = (int)(orderPrice*0.05);
		} else if(grade.equals("실버")) {
			point = (int)(orderPrice*0.02);
		} else if(grade.equals("브론즈")) {
			point = (int)(orderPrice*0.01);
		} else {
			point = (int)(orderPrice*0.003); // "골드"라고 입력했을 때 이것이 실행된다. 왜? (필기)
		}
		
		System.out.println("-------------------------------");
		System.out.println("고객명: " + name);
		System.out.println("고객등급: " + grade);
		System.out.println("구매금액: " + orderPrice);
		System.out.println("예상 적립 포인트: " + point);
		
		sc.close();
		
	}
}

 

여기까지 자바의 기본 - 변수, 자료형, 형변환, 변수의 범위, 제어문, 반복문, break, continue등을 배웠다.


배열 Array

정수 5개 저장하기

 

  • 배열을 몰랐을 때

int num1 = 10;
int num2 = 13;
int num3 = 16;
int num4 = 7;
int num5 = 30;

 

  • 저장할 데이터의 갯수만큼 변수를 선언해야한다.
  • 모든 데이터의 각각 서로 다른 이름으로 관리되고 있어, 한꺼번에 관리하기가 힘들다.
  • 연산을 하기 위해서는 모든 변수명을 일일이 적어야 한다.

<여러개의 데이터를 하나의 이름으로 관리하자!>

  • 저장할 데이터의 갯수만큼 변수를 선언할 필요가 없다.
  • 모든 데이터가 같은 이름으로 관리되고 있다.
  • 연산을 하기 위해서 모든 변수명을 적을 필요도 없다.

  • 값 하나 다루기

자료형 변수명 = 값;

int number = 10;
double average = 86.7;
boolean isPassed = true;

 

 

  • 객체 하나 다루기

클래스 참조변수명 = new 클래스();



String name = "홍길동";
Scanner sc = new Scanner(System.in);

 

 

 

 

    • 같은 타입의 값 여러개 다루기 - 배열을 생성한다.(콜렉션을 생성한다.)

자료형[ ] 참조변수명 = new 자료형[크기];

int[ ] number1 = new int[3];
int[ ] numbers = {10, 20, 30, 40, 20, 60, 90, 20, 40, 100};
double[ ] number2 = new double[3];

 

 

 

 

  • 같은 종류의 객체 여러개 다루기 - 배열을 생성한다.

(그런데 콜렉션이 배열보다 백만배 더 좋다. 콜렉션을 더 많이 사용한다. 거의 0.01 : 99.99 정도? 배열 혐오 수준)

클래스명[] 참조변수명 = new 클래스명[크기];

String[] names1 = new String[10];
String[] names2 = {"김유신", "강감찬", "이순신"};

Book[] books = new Book[5];
Emplyee[] employees = {new Employee(), new Employee(), mew Employee()};

 

 

  • 서로 다른 타입의 값 여러개 다루기 - 클래스를 정의하고, 객체를 생성한다.

클래스명 참조변소명 = new 클래스명();

예) Book book = new Book(); // 책번호(int), 저자(String), 출판사(String), 가격(int), 할인율(double), 재고량(int), 출판일(Date), ...
    Employee emp = new Employee();  // 사원번호(int), 이름(String), 소속부서번호(int), 직위(String), 입사일(Date), 연봉(long), ...


null

  • null은 주소값 대신 넣을 수 있다.
  • 참조자료값에서는 null참조값(주소값), 이렇게 딱 두 가지를 넣을 수 있다.

참조자료값에 주소값을 넣는 방법은 두 가지가 있다.

첫번째는 String str1 = new String("홍길동"); 를 작성해서 자동으로 주소값이 넣어지게 하는 것

두번째는 String str3 = str1; 를 입력해서 주소값을 복사하여 넣는 방법.

  • null은 참조변수가 참조하지 못하게 만든다.
  • 변수를 선언했을 때 기본값으로 넣을 수도 있다.

(ex) Person p = null;


배열도 객체이기 때문에 null에 대한 설명을 했다.

위에서 주소값이라고 적었는데, 주소값이라고 하지 않고 참조값(reference)라고 한다.

참고로 [], 대괄호는 브라켓(bracket)이라고 하고, {}, 중괄호는 브레이스(brace)라고 한다.


배열의 형식
  • 빈 배열으로 이루어진 형식
데이터타입[ ]변수명 = new 데이터타입[크기];
  • 값이 저장되어있는 배열로 이루어진 형식
데이터타입[ ]변수명 = {값, 값, 값, 값, ...};
  • 빈 배열 + 값이 저장되어있는 배열로 이루어진 형식
데이터타입[ ]변수명 = new 데이터타입[ ]{값, 값, 값, 값, ...};

배열 생성하기
int[] numbers = new int[3];
int[ ] : 정수값을 여러개 저장하는 배열객체
int[ ] numbers : int배열을 담는 변수 numbers / int[ ]의 주소값을 담는 참조변수 numbers을 생성한다.
new int[3] : new를 이용해서 정수 3개를 담는 배열객체 int[3]를 만든다. 0~2번까지 index번호가 붙는다.

int[ ] numbers = new int[3];
정수 3개를 저장할 수 있는 배열객체를 생성하고, 그 배열객체의 주소값을 numbers 참조변수에 대입한다.

이처럼 같은 타입의 값을 여러개 저장할 수 있게 만든 것이 배열이다.


배열객체의 각 저장소에 값 저장하기
// 참조변수[인덱스번호] = 값;
numbers[0] = 100;
numbers[1] = 300;
numbers[2] = 150;

배열객체의 각 저장소에 저장된 값 사용하기
  • 다른 변수에 대입하기
// 자료형 변수 = 참조변수[인덱스번호];
int x = numbers[0];
int y = numbers[1];
int z = numbers[2];

 

  • 연산에 사용하기
// 참조변수[인덱스번호] + 참조변수[인덱스번호] + 참조변수[인덱스번호];
int total1 = x + y + z;
int total2 = numbers[0] + numbers[1] + numbers[2];

System.out.println("합계: "+ total1);
System.out.println("합계: "+ total2);

// 참조변수[인덱스번호] > 100;

 

  • 출력하기
// System.out.println(참조변수[인덱스번호]);
System.out.println(x + "," + y + "," + z);
System.out.println(numbers[0] + "," + numbers[1] + "," + numbers[2]);​

 

배열의 값을 출력하는 방법은 세가지로 다시 나뉘게 된다.

      • 저장된 값 출력하기
System.out.println(numbers[0]);
System.out.println(numbers[1]);
System.out.println(numbers[2]);

 

      • for문을 사용해서 출력하기
for (int i=0; i<3; i++) {
		System.out.println(numbers[i]);
	}

 

      • 향상된-for문을 사용해서 출력하기
String[] name = new String[3];
		name[1] = "체다치즈";
        
for (String value : name) {
		System.out.println(value);
	}
향상된-for문은 배열, 컬렉션에 대해서만 사용할 수 있다.

우항에는 배열을 참조하는 참조변수, 좌항에는 배열의 각 저장소에 저장된 값 하나를 담을 수 있는 변수를 선언한다.
향상된-for문은 배열의 0번째 값을 value에 대입하고, for문 블록의 수행문을 실행한다.
: 처음 0번째 값 담기고 출력 (null) → 1번째 값 담기고 출력 ("체다치즈") → 2번째 값 담기고 출력 (null).

배열 속의 값 다루기

우리는 배열 속에 있는 값을 다루는 것이지, 배열자체를 다루지 않는다.

// 지정된 값이 미리 저장되어 있는 배열객체 생성하기

int[] arr1 = {100, 30, 60, 50, 90};
double[] arr2 = {0.1, 0.3, 0.25, 0.15};
String[] arr3 = {"김유신", "이순신", "강감찬", "류관순", "안중근"};

 

  • 각 배열의 0번째 값 출력해보기
더보기
System.out.println(arr1[0]);
System.out.println(arr2[0]);
System.out.println(arr3[0]);

 

  • 각 배열의 길이를 출력해보기
더보기
System.out.println(arr1.length);
System.out.println(arr2.length);
System.out.println(arr3.length);

 

  • 각 배열의 마지막번째 값 출력해보기
더보기
System.out.println(arr1[arr1.length - 1]);
System.out.println(arr2[arr2.length - 1]);
System.out.println(arr3[arr3.length - 1]);

 

  • for문을 이용하여 각 배열의 모든 값 출력하기
더보기
for (int i=0; i<arr1.length; i++) {
	System.out.println(arr1[i]);
}

for (int i=0; i<arr2.length; i++) {
	System.out.println(arr2[i]);
}

for (int i=0; i<arr3.length; i++) {
	System.out.print(arr3[i] + " ");
}

 

  • 향상된-for문을 이용하여 각 배열의 모든 값 출력하기
더보기
for (int value : arr1) {
	System.out.println(value);
}
		
for (double value : arr2) {
	System.out.println(value);
}
		
for (String name : arr3) {
	System.out.println(name);
} // 꼭 변수를 value라고 쓸 필요는 없다.

아래의 값 배열에 담아보기

 

학생이름 국어점수 영어점수 수학점수
김유신 100 70 80
강감찬 70 60 60
류관순 80 90 80
이순신 100 79 100

 

서로 다른 타입의 값들을 하나의 배열 안에 담을 수 없기 때문에, 같은 타입의 값끼리 각각 저장해야한다.

 

String[] names = {"김유신", "강감찬", "류관순", "이순신"};
int[] kor = {100, 70, 80, 100};
int[] eng = {70, 60, 90, 70};
int[] math = {80, 60, 80, 100};

 

  • 류관순 학생의 이름, 국어점수, 영어점수, 수학점수, 총점, 평균점수를 출력하기
더보기
int amount = kor[0] + eng[0] + math[0];
int average = amount/3;
		
System.out.println("이름: " + names[0]);
System.out.println("국어: " + kor[0]);
System.out.println("영어: " + eng[0]);
System.out.println("수학: " + math[0]);
System.out.println("총점: " + amount);
System.out.println("평균: " + average);

 

  • 향상된-for문을 사용하여, 모든 학생의 국어점수 평균, 영어점수 평균, 수학점수 평균을 출력하기
더보기
int korTotalScore = 0;
int korAverage = 0;

for (int korScore : kor) {
	korTotalScore += korScore;
}

korAverage = korTotalScore/kor.length;
		
System.out.println("국어점수 평균: " + korAverage);

// 반복

int engTotalScore=0;
int engAverage=0;

for(int engScore : eng) {
engTotalScore += engScore;
}

engAverage = engTotalScore/eng.length;
		
System.out.println("영어점수 평균: " + engAverage);
		
int mathTotalScore=0;
int mathAverage=0;

for(int mathScore : math) {
	mathTotalScore += mathScore;
}

mathAverage = mathTotalScore/math.length;
		
System.out.println("수학점수 평균: " + mathAverage);

 

  • for문을 사용해서, 국어점수 평균보다 국어점수가 낮은 학생의 이름과 국어점수를 출력하기
더보기
System.out.println("전체 국어평균점수보다 국어점수가 낮은 학생의 이름과 국어 점수");

for (int index = 0; index < kor.length; index++) {
	int korScore = kor[index];
    
	if (korScore<korAverage) {
		String name1 = names[index];
		System.out.println("이름: " + name1 + ", 국어점수: " + korScore);
	}
    
}

 

변수를 담는 것은 단수형으로 짓고, 배열명은 복수형으로 작성한다.


콤마를 기준으로 값을 나누어 담게 할 수 있다.

// 콤마를 기준으로 나누기
String text = "김유신, 강감찬, 이순신, 유관순, 안중근, 홍길동";
String[] items = text.split(",");		items ====> {"김유신", "강감찬", "이순신", "류관순", "안중근", "홍길동"}

public class String {

	// 지정된 구분문자로 문자열을 잘라서 각각의 문자열을 배열에 순서대로 담아서 반환한다.
	public String[] split(String delim) {
		...
	}
}

자바는 무조건 처음에 배열의 길이를 정해줘야 하고, 한 번 정한 길이는 바꿀 수 없다. 자바의 배열은 불변의 특성을 가지기 때문인데, 다른 프로그래밍 언어에서는 자바와 다르게 배열의 크기를 고정시켜두지 않아서 배열을 많이 사용한다. 자바에서는 배열을 사용하는 경우가 한정되어 있다. 하필 반환값이 배열인 경우를 제외하고는 잘 사용하지 않는다.

 

배열은 length라는 property밖에 없고, 설계도도 없고, 기능도 없다. 검색, 삭제, 정렬 이런 기능이 하나도 없어서 사용하지 않는다. 이 단점을 극복하기 위해 만든 것이 콜렉션 프레임워크 이다. String다음으로 많이 사용한다.

 

참고로 프레임워크(framework)는 특별한 아이디어 혹은 개발방법을 구현해 놓은 것이다.


콜렉션 프레임워크
  • 자료구조를 자바로 구현한 것이다.
  • 자료구조는 데이터 저장, 검색, 조회, 삭제 기능을 제공하는 구현체다.
  • List, LinkedList, Set, Stack, Queue, Tree, Map등이 있다. 기본 사이즈가 10이상이다. 다 목적이 다르다.
    • List : 저장한 순서대로 다시 꺼낼 수 있다. (제일 많이 압도적으로 많이 쓴다. 내부적으로는 배열이다. 그래서 다변길이 배열이라고도 부른다.
    • LinkedList : 자료의 중간부분의 데이터를 저장 / 삭제 하는 속도가 매우 빠르다.
    • Set : 중복을 허용하지 않는다.
    • Stack : 후입선출(LIFO : Last In First Out) 맨 마지막에 저장된 데이터가 가장 먼저 꺼내진다.
    • Queue : 선입선출(FIFO : First In First Out) 먼저 저장된 데이터가 가장 먼저 꺼내진다.
    • Tree : 데이터가 정렬된 상태로 저장된다.
    • Map : 데이터가 name:value의 쌍으로 저장된다.

사용자로부터 0과 양의 정수만 입력받아서, 그 중에서 가장 큰 수를 출력하는 프로그램 만들기

-1을 입력하면 입력을 끝냅니다.

더보기

 

import java.util.Scanner;

public class ArrayApp5 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		int[] numbers = new int[100];	// 대략적인 값 100
		int position = 0;
										
		// 사용자로부터 0과 양의 정수만 입력받는다.      {10, 20, 30} -1
		for (int i = 0; i < 100; i++) { 
			System.out.print("숫자를 입력하세요(-1을 입력하면 입력을 끝냅니다.):");
			int num = sc.nextInt();
            
			// -1을 입력하면 숫자입력받는 것을 중단시키기 위해서 if문을 활용
       	  		 if (num == -1) {
				position = i;
				break;
			}
			numbers[i] = num;
		}
		System.out.println();
		
		// 사용자가 입력한 값 출력하기
		System.out.print("사용자가 입력한 숫자 출력하기: ");
		for (int i = 0; i < position; i++) {
			System.out.print(numbers[i] + " ");
		}
		System.out.println();
		
		// 가장 큰 숫자 찾기
		System.out.print("사용자가 입력한 가장 큰 숫자 출력하기: ");
		int max = 0;
		for (int i = 0; i< position; i++) {
        
        	// max에 저장된 값보다 배열의 n번째 값이 더 큰 경우 max에 저장된 값을 바꾸기 위해서 if문 사용
			if (numbers[i] > max) {		
				max = numbers[i];
			}
		}
		System.out.println(max);
		
		sc.close();
	}
}

<가장 큰 숫자 찾는 방법>

예를들어, 0과 양의 정수를 {3, 21, 7, 42, 9}로 입력받았다고 가정한다.

 

max변수를 정하고 제일 작은 값을 정한다. int max = 0;

 

max에 저장된 값보다 배열의 n번째에서 꺼낸 값이 큰 경우,
max에 배열의 n번째 값을 저장한다.

 

첫번째 값부터 비교를 한다.

0과 3 중에 큰 숫자로 바뀐다 => max = 3
3과 21중에 큰 숫자로 바뀐다 => max = 21
21과 7중에 큰 숫자로 바뀐다. => max = 21

 

 

 

배열의 값을 어떻게 저장하고 빼는지. 그러기 위해 for, if문을 쓰는것을 보여주기 위해 이 예제를 공부함.