1. 명령행 인자
- parameter(인자): 함수 혹은 메서드의 원형에 정의된 매개 변수를 의미한다. main() 함수에서는 args
- argument(인수): 함수에 실제로 전달된 인자 값을 의미한다.
public class InputArgs {
public static void main(String[] args) {
String name = args[0];
String city = args[1];
System.out.println(city + "에 사는 " + name + "님 반갑습니다!");
}
}
실행 시 다음 에러 발생
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
main() 함수에 인자를 전달하기 위해서는 실행 방법이 달라져야 한다.
main() 메서드에 명령행 인자(command line arguments)를 넣어 실행하려면 자바 프로젝트의 launch.json 파일을 생성해야 한다.
좌측의 Run and Debug 버튼 > launch.json 파일 만들기
하단 구성 추가 > Java: Launch Program with Arguments Prompt > 저장
Explorer 패널로 돌아가서 InputArgs.java 파일 선택 > Run and Debug 패널, 상단 선택창에서 Launch with Arguments Prompt 선택 > 실행 버튼
2. 함수로 변환하기
다음 기존 코드를 함수를 이용하여 분할하자
import java.util.Scanner;
public class FibonacciV1 {
public static void main(String[] args) {
System.out.println("피보나치 수열 만들기");
Scanner s = new Scanner(System.in);
System.out.println("수열 개수를 입력하세요");
int num = s.nextInt();
s.close();
int a = 1;
int b = 1;
int[] fibonacci = new int[num];
fibonacci[0] = a;
fibonacci[1] = b;
for(int i=0; i < (num - 2); ++i) {
fibonacci[i+2] = a + b;
a = b;
b = fibonacci[i+2];
}
System.out.println("결과: ");
for (int i=0; i<num; ++i) {
System.out.println(fibonacci[i]);
}
}
}
사용자 입력 받기
피보나치 수열 생성하기
결과 출력하기
import java.util.Scanner;
public class FibonacciUsingFtn {
static int getUserInput() {
Scanner s = new Scanner(System.in);
System.out.println("수열 개수를 입력하세요.");
int num = s.nextInt();
s.close();
return num;
}
static void getFibonacci(int fibonacci[]) {
int a = 1;
int b = 1;
// int[] fibonacci = new int[num];
int num = fibonacci.length;
fibonacci[0] = a;
fibonacci[1] = b;
for(int i=0; i < (num - 2); ++i) {
fibonacci[i+2] = a + b;
a = b;
b = fibonacci[i+2];
}
}
static void printNumbers(int[] numbers) {
System.out.println("결과: ");
for (int i=0; i<numbers.length; ++i) {
System.out.println(numbers[i]);
}
// or
for (int number : numbers) {
System.out.println(number);
}
}
public static void main(String[] args) {
// 반환값이 없는 함수를 선언할 때 void 표기
System.out.println("피보나치 수열 만들기");
int num = getUserInput();
int[] fibonacci = new int[num];
getFibonacci(fibonacci);
printNumbers(fibonacci);
}
}
이런 일련의 작업들을 refactoring이라고 한다.
refactoring: 결과 변경 없이 코드의 구조를 재조정함. 주로 가독성을 높이고 유지보수를 편하게 만든다. 버그를 없애거나 새로운 기능을 추가하는 행위가 아니며, 사용자가 보는 외부 화면은 그대로 두면서 내부 논리나 구조를 바꾸고 개선하는 유지보수 행위이다.
대표적으로 필드 은닉, 메서드 추출, 타입 일반화, 메서드 이름 변경 등이 있다.
이번에 한 건 메서드 추출(extract method) 기멉ㅂ이다. 코드를 간결하게 하기 위해 코드의 내용을 의미 단위인 함수로 뽑아내는 것을 의미한다.
함수의 문법
static <반환형> <함수이름> ( <함수 인자들> ) {
... 처리 내용
return <반환 데이터>
}
3. String type
- char: 유니코드 한 글자
- char 배열: low-level. 먼저 배열의 크기를 할당하고, 배열에 내용을 넣는 방식. 길이 구하려면
var.length
- string: 문자열의 길이를 고려하지 않아도 된다. 길이 구하려면
var.length()
string의 메서드 예제
public class StringLengthChartAt {
public static void main(String[] args) {
// 1. length()
String java = "Java";
int len = java.length();
System.out.println(java+"의 길이는 "+len);
String emptyString = "";
System.out.println("빈 문자열의 길이는 "+emptyString.length());
// 2. charAt()
String[] stars = {
"물병자리", "사수자리", "백조자리",
};
for (String star : stars) {
char firstChar = star.charAt(0);
char lastChar = star.charAt(star.length() - 1);
System.out.println("첫 번째 글자는 "+firstChar + ", 마지막 글자는 " + lastChar);
}
}
}
length()
method: 주어진 문자열의 길이 반환emptyString
: 문자열 변수의 초기값으로 사용charAt()
method: 문자열의 특정 인덱스에 있는 char을 반환
public class StringSubstringEquals {
public static void main(String[] args) {
// substring()
String poem =
"Two roads diverged in a yellow wood,\n" +
"And sorry I could not travel both";
String samePoem = poem.substring(0);
String firstWord = poem.substring(0, 3);
String secondLine = poem.substring(37);
System.out.println("시의 내용은:\n" + samePoem);
System.out.println("시의 첫 번째 단어는: " + firstWord);
System.out.println("시의 두 번째 줄은: " + secondLine);
// equals(), equalsIgnoreCase()
String apple = "apple";
String macintosh = "macintosh";
String mac = "Macintosh";
boolean isSame = apple.equals(mac);
boolean isSameWord = macintosh.equalsIgnoreCase(mac);
System.out.println(isSame +"\t같은가요?");
System.out.println(isSameWord +"\t같은 단어인가요?(대소문자 무관)");
}
}
substring()
method: 시작 인덱스, 끝 인덱스를 받아 문자열의 구간을 반환. 끝 인덱스 없으면 끝까지.equals()
method: 문자열 비교 시에는 이 메서드를 사용해야만 함. 등호(==) 사용하면 안 됨equalsIgnoreCase()
method: 대소문자를 무시하고 같은 문자열인지 비교
public class StringIndexOf {
public static void main(String[] args) {
// indexOf()
String poem =
"Two roads diverged in a yellow wood,\n" +
"And sorry I could not travel both";
int firstAndPosition = poem.indexOf("And");
int firstIPosition = poem.indexOf("I");
System.out.println("And의 첫 위치는 "+firstAndPosition +", I의 첫 위치는 "+firstIPosition);
int secondLineIndex = firstAndPosition;
System.out.println("두 번째 줄의 위치는 "+secondLineIndex);
System.out.println("두 번째 줄의 내용은 " + poem.substring(secondLineIndex));
// lastIndexOf()
poem += "\nAnd be one traveller, long I stood";
int lastAndPosition = poem.lastIndexOf("And");
System.out.println("And의 마지막 위치는 "+lastAndPosition);
}
}
indexOf()
method: 입력한 문자열의 첫 번째 위치를 반환lastIndexOf()
method: 입력한 문자열의 마지막 위치를 반환
public class StringStartsEndsWith {
public static void main(String[] args) {
// startsWith()
String[] poem = {
"Two roads diverged in a yellow wood",
"And sorry I could not travel both",
"And be one traveller, long I stood",
};
for (int i=0; i<poem.length; ++i) {
String line = poem[i];
boolean startsWithAnd = line.startsWith("And");
System.out.println((i+1)+"번째 줄은 And로 시작하나요? " + startsWithAnd);
}
// endsWith()
for (int i=0; i<poem.length; ++i) {
String line = poem[i];
boolean endsWithOod = line.endsWith("ood");
System.out.println((i+1)+"번째 줄은 ood로 끝나나요? " + endsWithOod);
}
}
}
startsWith()
method: 주어진 문자열로 시작하는지 return boolean typeendsWith()
method:주어진 문자열로 끝나는지 return boolean type
public class StringReplaceIsEmpty {
public static void main(String[] args) {
// replace()
String javaWiki = "Java is a general-purpose programming language. Java";
String python = javaWiki.replace("Java", "Python");
System.out.println(javaWiki);
System.out.println(python);
// isEmpty()
String msg = ""; // default
System.out.println("빈 문자열인가요? " + msg.isEmpty());
msg = "새로운 메시지가 도착했습니다";
System.out.println("빈 문자열인가요? " + msg.isEmpty());
}
}
replace("검색할 문자열", "대체할 문자열")
isEmpty()
: 빈 문자열인지 return boolean type
'Java' 카테고리의 다른 글
5. 객체 지향 입문 (0) | 2024.06.18 |
---|---|
3. 제어문 (0) | 2024.06.13 |
2. 자바 언어 기본 (0) | 2024.06.12 |
VSCode에서 Java 실행환경 세팅하기 (0) | 2024.06.11 |
[Java] Java 11 설치 (0) | 2024.03.20 |