자료구조 세미나 (1)
- while문은 주로 무한반복할 때 쓰게 될거야. 그래서 코딩할 때 보면 for문을 더 많이 사용할거야.
-
Array
-
String
Scanner.next()
: 개행문자나 띄어쓰기를 제외하고 입력 받는다.Scanner.nextLine()
: 모든 입력을 받는다. -
Class & Method 클래스 : 객체를 생성하기 위한 틀 클래스에는 변수 , 메소드 생성자, 소멸자 등이 들어갈 수 있다. 앞으로 우리는 변수, 메소드, 생성자 세개를 많이 쓸거야. 단, 모든 프로그램은 반드시 메인 메소드를 가져야 한다.
- 클래스 내부에서 노예의 역할. 일 시키면 해해야한다. <접근자> <리턴타입><메소드이름>(<매개변수>){메소드 구현} ex) `public int getSum(int a, int b){return a+b;}` 내 클래스 안에 있는 메소드는 내 소유 - 마음껏 부릴 수 있다. 다른 클래스 안에 있는 메소드는 다른 클래스 소유 -> 허락 받아야 쓸 수 있다. (객체) 메소드 호출 방법 : 메소드 이름(매개변수); 매개변수>메소드이름>리턴타입>접근자>
- 메소드의 첫글자는 항상 소문자로 적어라.
- 메인 메소드 : 프로그램이 실행될 때 가장 먼저 실행되는 메소드
- public : 프로그램을 실행할 때 JVM(Java Virtual Machine)이 쉽게 접근할 수 있도록 함
- static : 메모리에 바로 올려 놓아 별도의 객체가 필요 없이 바로 실행이 가능하도록 함 -> 메인 메소드는 아무도 호출해주지 않고, 프로그램이 실행될 때 JVM에서 바로 실행해야 하므로 시작과 동시에 메모리에 올려놔야 한다.
- static 으로 선언된 method는 “static끼리”만 친하다.
- static이 붙으면 객체를 호출할 필요가 없기 때문에 바로 동작한다. 그런데 static을 빼면 main에 있는 함수와 plus는 같은 Hello라는 클래스에 있는게 아니다. Main은 밖에 나와있기 때문에 허락을 받아서 객체를 생성해서 Hello.plus(a,b) 이런 식으로 접근해야 한다.
- static을 많이 쓰는건 쓸데 없는 메모리 낭비 이므로 주로 사용하지 않는다. 필요한 애들만 올려야지. 후자의 방법을 참고하자.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int a = 5;
int b = 10;
Main hello = new Main();
int sum = hello.plus(a, b);
System.out.println("합은 " +sum + " 입니다.");
}
public int plus(int x, int y) {
return x+y;
}
}
객체란 ?
클래스 - 변수형 클래스 , 함수형 클래스 ?
C언어 구조체? 여러 변수를 하나에 담아 놓은 것. 변수형 클래스는 구조체랑 비슷해.
함수형 클래스는 ? 우리가 main에서 만든 것. 기능적인 것이 주가되는 클래스.
변수형 클래스는 변수가 겁나 많고 그리고 그 변수를 관리를 해준다. 함수형 클래스는 메소드가 많다.
그걸 보여줄게
계좌 관리 프로그램을 만들어 본다고 하자. 계좌 관리를 위해서는 예금주, 계좌번호, 잔액 등 필요.
변수는 뭘로 선언 ? 변수는 private으로 선언한다.
계좌 관리 클래스 만들어놓고 변수를 다 퍼블릭으로 선언하면 누구나 접근이 가능하니까. 변수를 다 바꿀 수 있는거야. 클래스형 변수를 만드는 이유는 , encapsulation. 캡슐화를 시키고. 쉽게 생각하면 그냥 안전하게 변수를 관리하기 위해서. 변수형 클래스안에서 만드는 변수들은 항상 private으로 ! (시험에서 자료구조 감점 받는다)
private으로 선언했으면, 남들이 접근을 못한다. 그 접근을 method를 이용해서 접근을 해라. 나를 거쳐라 이뜻. 그래서 getter/setter를 이용한다.
우리가 사용했던 코드들은 다 메소드 안에서 변수를 선언했었다. 그런데 이제는 변수가 메소드 안에 있지 않고 바로 클래스 밖에 있다. 변수형 클래스라고 말한 이유가. 변수를 여러개를 관리하기 위해서 존재하기 위한 클래스 이기 때문이다.
마우스 우클릭 -> source -> generate Getter and Setter -> Generate 를 하면 게터 세터를 생성해준다.
그리고 필요한 메소드 생성. withdraw, deposit 메소드 생성
얼마 출금할지 파라미터를 넘겨서 줍ㄴ다. 그 때, 출금할 때
객체를 배열로 선언하는 방법 (주의!)
일반 변수 배열을 선언할 때 => int[] abc = new int[10];
객체를 배열을 선언할 때 => Account[] account = new Account[10];
가 끝이 아니다.
반드시 객체를 배열로 선언한 후 , 각 공간의 객체를 생성(생성자 호출) 해줘야 한다.
Account[] accounts = new Account[10];
for(int i = 0; i< 10; i ++){
accounts[i] = new Account("이름", "계좌번호",0);
}
Practice 학생 조회 프로그램을 만든다.
- Student 클래스 생성
- 5rodml Student 객체를 생성하여 학생들의 정보를 입력(자유롭게)
- 학생 검색 메뉴를 무한반복
- 메뉴 : 이름으로 검색/ 학번으로 검색 / 종료
예제를 통해 배운 것
nextInt() 사용 후 nextLine() 사용시 문제점 발생
Scanner.nextInt() 메소드는 사용자의 입력의 가장 마지막 개행문자(enter,newline)를 제거하지 않는다.
해결 방안 1. nextLine() 출력하기
해결 방안 2. nextInt()를 Scanner.nextLine()으로 입력받고 Integer.parseInt()로 변환한다.
주소값 비교와 내용 비교
equals 메소드는 비교하고자 하는 대상의 내용 자체를 비교한하지만, == 연산자는 비교하고자 하는 대상의 주소값을 비교한다.
java의 exit();
java 에서는 exit() 시스템 함수를 쓰고 싶으면
System.exit(0)
이와 같이 사용한다.
참고자료
2019년 3월 20일 자료구조 세미나(1) 이명재 조교님
자바 nextInt()의 개행 문제 https://allg.tistory.com/17
자바 == 연산자와 equals https://kmj1107.tistory.com/entry/JAVA-%EB%AC%B8%EC%9E%90%EC%97%B4string-%EB%B9%84%EA%B5%90-equals%EC%99%80-%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90-equals%EC%9D%98-%EB%B0%98%EB%8C%80