어떤 기능을 하는 코드를 묶음으로 묶은 것을 의미 , 데이터를 입력받아 해당 데이터에 일련의 처리를 가함으로써 만들어낸 결과값을 반환
A main(B C) {
D
}
A : 반환_타입 메서드_이름(B: 매개변수_타입 C: 매개변수_이름) {
D : 메서드_바디
}
메서드는 결과값을 반환한다. 이 처리 결과는 일종의 ‘값’의 형태로 반환되며, 이를 반환값이라고 한다. 값에는 여러 종류가 나뉘어져 있으며, 정수를 나타내는 정수형, 한 개의 문자를 나타내는 문자형 등으로 구성 , 이러한 값의 유형 및 종류를 ‘데이터 타입’ , ‘타입’이라고 한다. 다시 말해, 반환 타입은 메서드가 반환할 반환값의 종류 및 유형을 의미
: 매개변수는 변수에 외부로부터 전달받은 값을 저장하고 있는 변수를 매개 변수라 하고. 매개변수의 타입은 어떤 유형의 값을 메서드가 입력받을 것인지를 명시하는 것을 의미
메소드 바디는 구체적으로 메서드가 어떤 기능을 수행할 지에 대한 코드를 작성하는 부분
메소드를 실행시키려면 아래처럼 호출을 해주어야 한다.
add(1,2);
메소드 이름에 호출 연산자 () 를 붙여서 메서드를 호출할 수 있다. () 안에는 앞서 언급한 매개변수에 넣어줄 값을 입력하면 된다.
값이 변할 수 있는 데이터를 임시적으로 저장하기 위한 수단
컴퓨터는 메모리에 데이터를 저장하게 된다. 메모리는 1byte크기의 데이터를 저장할 수 있는 메모리 셀들이 모여서 만들어 지며, 각 메모리셀에는 고유 번호가 오름차순으로 매겨져 있다. 이처럼 메모리셀에 붙여져 있는 고유 번호를 메모리 주소라고 한다.
class Main {
public static void main(String[] args) {
0xf38d2a6c = 1; // 값 저장
출력(0xf38d2a6c) // 값 사용
}
}
위의 예제는 메모리 0xf38d2a6c에 숫자 1을 저장한 다음, 0xf38d2a6c
가 저장하고 있는 값을 출력하는 의사 코드이며, 저장해야 할 값이 많을 때, 사람이 메모리 주소를 식별하기 어렵다.
이 문제를 해결해주는 것이 바로 변수이며, 변수를 사용하면 아래와 같이 값을 저장할 수 있다.
class Main {
public static void main(String[] args) {
int num1 = 1;
int num2 = 2;
int num3 = 3;
...
}
}
자바에서 변수명은 일반적으로 카멜 케이스(camelCase)를 사용한다.
카멜케이스란 낙타 등 모양을 닮았다고 해서 붙여진 이름으로, 두 번째 단어부터 대문자로 시작해 구분한다.
int camelCase;
// 아래의 모든 변수의 변수명은 허용되는 변수명입니다.
int num;
int NUM; // num과 다른 변수입니다.
int num_1;
int num$1;
int 10Age; // Error 숫자로 시작하는 변수명은 사용할 수 없다.
int byte; // Error 이미 사용중인 예약어는 변수명으로 사용할 수 없다.
int class; // Error 이미 사용중인 예약어는 변수명으로 사용할 수 없다.
변하지 말아야 할 데이터를 임시적으로 저장하기 위한 수단
상수는 간단히 말해, 재할당이 금지된 변수이다. 상수는 final 이라는 키워드를 사용해 선언할 수 있으며, 관례적으로 대문자에 언더바_ 를 넣어 구분하는 SCREAMING_SNAKE_CASE를 사용한다.
final double CALCULATOR_PI = 3.14;
class Main {
public static void main(String[] args) {
기본타입변수 = 1;
참조타입변수 = 객체;
출력(기본타입변수);
출력(참조타입변수);
}
}
public class Main {
public static void main(String[] args) {
int primitive = 1;
Object reference = new Object();
System.out.println(primitive);
System.out.println(reference);
}
}
...
> Task :Main.main()
1
java.lang.Object@626b2d4a
...
여기에서는 객체를 ‘ 어떤 사물의 특성과 동작을 하나로 묶어놓은 것’ 으로 이해하면 된다.
리터럴은 ‘문자 그대로’ 라는 뜻을 가진다. 프로그래밍에서는 리터럴이란 문자가 가리키는 값 그 자체를 의미한다.
class Main {
public static void main(String[] args) {
int num; // 변수 선언
num = 1; // 값 할당
}
}
num에 할당하고 있는 1이 리터럴이다.
[표] 정수타입의 종류
long 타입 리터럴의 경우에는 접미사 L을 붙여야한다 , 일반적으로 숫자 1 과 혼동을 방지하기 위해 L을 붙임
[표] 실수 타입의 종류
// float형 리터럴을 float형 변수에 할당
float num1 = 3.14f;
// double형 리터럴을 double형 변수에 할당
double num2 = 3.141592d;
double num2 = 3.141592;
double형 리터럴에는 접미사 d를 붙여도, 붙이지 않아도 되지만 float 형 리터럴에는 접미사 f를 반드시 !! 붙여줘야 한다.
논리 타입의 종류는 boolean형 한가지 뿐이다. boolean 형은 참 또는 거짓을 저장할 수 있는 데이터 타입으로, 오직 true 혹은 false를 값으로 가진다.
boolean은 1bit만 있으면 되지만, JVM이 다룰 수 있는 데이터의 최소 단위가 1byte여서 boolean형은 1byte(8bit)의 크기를 가진다.
boolean isRainy = true;
boolean isAdult = false;
문자 타입은 2byte 크기의 char형 오직 하나만 있다.
문자형 리터럴을 작성할 때에는 반드시 큰 따옴표(””)가 아닌 작은 따옴표(’’)를 사용해야 한다.
char letter1 = 'a';
char letter2 = 'ab'; // 에러 : 단 하나의 문자만 할당할 수 있습니다.
char letter3 = "a" // 에러 : 작은 따옴표를 사용해야 합니다.
char letter = 65;
System.out.print(letter); // 출력 결과 : A 65에 해당하는 유니코 드 값을 반환
아래의 두 경우에는 타입이 자동으로 변환된다.
// float이 long보다 정밀하므로, 자동으로 타입이 변환됩니다.
long longValue = 12345L;
float floatValue = longValue;
System.out.println(floatValue); // 12345.0이 출력됩니다.
차지하는 메모리 용량이 더 큰 타입에서 작은 타입으로는 자동으로 타입이 변환되지 않는다. 이때 더 큰 데이터 타입을 작은 데이터 타입의 변수에 저장하기 위해서는 수동으로 타입을 변환해주어야 한다. 이를 캐스팅(casting)이라 한다.
수동으로 타입을 변환할 때에는 캐스팅 연산자 ()를 사용하며, 캐스팅 연산자의 괄호 안에 변환하고자 하는 타입을 적어주면 된다.
//int 타입으로 선언된 변수 intValue를 더 작은 단위인 byte로 변환합니다.
int intValue = 128;
byte byteValue = (byte)intValue;
System.out.println(byteValue); // -128
기본적으로 String 타입은 큰따옴표로(””)로 감싸진 문자열을 의미한다.
// 문자열 리터럴을 String 타입의 변수 name에 할당하는 방법
String name1 = "Kim Coding";
// String 클래스의 인스턴스를 생성하는 방법
String name2 = new String("Kim Coding");
String 변수명;
으로 선언할 수 있다.변수 = “문자열”;
변수 = new String(”문자열”);
String name1 = "Kim Coding";
String name2 = "Kim Coding";
String name3 = new String("Kim Coding");
String name4 = new String("Kim Coding");
boolean comparison1 = name1 == "Kim Coding"; // true
boolean comparison2 = name1 == name2; // true
boolean comparison3 = name1 == name3; // false
boolean comparison4 = name3 == name4; // false
boolean comparison5 = name1.equals("Kim Coding"); // true
boolean comparison6 = name1.equals(name3); // true
boolean comparison7 = name3.equals(name4); // true
name1 과 name2 의 저장된 주소는 동일하다. 이 두 변수는 같은 문자열의 참조값을 공유한다.
반면, name3와 name4는 String 타입의 변수에 할당하는 방법을 사용하고 있다. 이처럼 String 클래스의 인스턴스를 생성하게 되면, 문자열의 내용이 같을지라도 별개의 인스턴스가 따로 생성된다. 따라서, name3 와 name4의 인스턴스 참조값은 서로 다르다.
equals()은 변수가 담고 있는 내용이 일치하는지를 묻는다.
해당 문자열의 특정 인덱스에 해당하는 문자를 반환한다.
String str = new String("Java"); // Java
System.out.println("문자열 : " + str); // 문자열 : Java
System.out.println(str.concat("수업")); //Java수업
System.out.println("concat() 메서드 호출 후 문자열 : " + str);// Java
String str = new String("Java");
System.out.println("문자열 : " + str); // "문자열 : Java"
System.out.println(str.charAt(0)); // 'J'
System.out.println(str.charAt(1)); // 'a'
System.out.println(str.charAt(2)); // 'v'
System.out.println(str.charAt(3)); // 'a'
System.out.println("\ncharAt() 메서드 호출 후 문자열 : " + str);
해당 문자열을 인수로 전달된 문자열과 사전 편찬 순으로 비교한다.
String str = new String("abcd");
System.out.println("문자열 : " + str); //
System.out.println(str.compareTo("bcef")); // -1
System.out.println(str.compareTo("abcd") + "\n"); // 0
System.out.println(str.compareTo("Abcd")); // 32
System.out.println(str.compareToIgnoreCase("Abcd")); 0
System.out.println("compareTo() 메서드 호출 후 문자열 : " + str);
compareTo() 메서드는 대소문자를 구분하여 , 두 문자열이 같다면 0 을 반환하며, 해당 문자열이 인수로 전달되는 문자열보다 작으면 음수를 , 크면 양수를 반환한다.
compareTOIgnoreCase()를 사용하면 대소문자를 구분하지 않는다.
해당 문자열의 뒤에 인수로 전달된 문자열을 추가한 새로운 문자열을 반환한다
해당 문자열에서 특정 문자나 문자열이 처음으로 등장하는 위치의 인덱스를 반환한다. 포함되지 않으면 -1을 반환한다.
String str = new String("Oracle Java");
System.out.println("문자열 : " + str); // 문자열 : Oracle Java
System.out.println(str.indexOf('o')); // -1
System.out.println(str.indexOf('a')); // 2
System.out.println(str.indexOf("Java")); // 7
System.out.println("indexOf() 메서드 호출 후 원본 문자열 : " + str); // indexOf() 메서드 호출 후 원본 문자열 : Oracle Java
해당 문자열의 맨 앞과 맨 뒤에 포함된 모든 공백문자를 제거해준다.
String str = new String(" Java ");
System.out.println("문자열 : " + str); // 문자열 : Java
System.out.println(str + '|'); Java |
System.out.println(str.trim() + '|'); Java|
System.out.println("trim() 메서드 호출 후 문자열 : " + str);// trim() 메서드 호출 후 문자열 : Java
해당 문자열의 모든 문자를 소문자로 변환
해당 문자열의 모든 문자를 대문자로 변환
String str = new String("Java");
System.out.println("문자열 : " + str);//문자열 : Java
System.out.println(str.toLowerCase()); // java
System.out.println(str.toUpperCase()); // JAVA
System.out.println("두 메서드 호출 후 문자열 : " + str); // 두 메서드 호출 후 문자열 : Java
StringTokenizer 클래스는 문자열을 우리가 지정한 구분자로 문자열을 쪼개주는 클래스, 쪼개어진 문자열을 우리는 토큰(token)이라고 부른다.
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args){
String str = "This is a string example using StringTokenizer";
StringTokenizer tokenizer = new StringTokenizer(str);
System.out.println(str); // This is a string example using StringTokenizer
System.out.println(); //
System.out.println("total tokens:"+tokenizer.countTokens()); // total tokens:7
// 아래의 while 코드는 반복문의 한 종류인데 어떻게 작동하는지 추후 반복문 챕터에서 공부할 예정이니 걱정하지 않으셔도 됩니다.
while(tokenizer.hasMoreTokens()){ // True 일 동안만
System.out.println(tokenizer.nextToken());
}
System.out.println("total tokens:"+tokenizer.countTokens());
}
}
This
is
a
string
example
using
StringTokenizer
total tokens:0
남아있는 token의 개수를 반환한다. 전체 token의 개수가 아닌 현재 남아있는 token의 개수이다
두 메서드의 성능적인 차이는 없다. 둘다 동일한 값을 반환한다. 메서드는 현재 위치 뒤에 있는 문자열에서 하나 이상의 토큰을 사용할 수 있는 경우 true를 반환하고 그렇지 않으면 false를 반환한다.
이 두 메서드는 다음의 토큰을 반환한다.
한번 생성된 String 클래스의 인스턴스는 여러 개의 문자열을 더할 때 매번 새로운 인스턴스를 생성해야하는 문제를 막기위해 사용
public class Main {
public static void main(String[] args) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("문자열 ").append("연결");
String str = stringBuilder.toString();
System.out.println(stringBuilder); //문자열 연결
System.out.println(str); //문자열 연결
}
}
문자열을 출력할 때, 변수에 문자열을 할당할 때에는 toString() 메서드를 사용.
String 클래스의 인스턴스는 한 번 생성되면 그 값을 읽기만 할 수 있고, 변경할 수는 없다.하지만, StringBuffer 클래스의 인스턴스는 그 값을 변경할 수도 있고, 추가할 수 있다. StringBuffer 클래스는 내부적으로 버퍼라고 하는 독립적인 공간을 가진다.
버퍼 크기의 디폴트 값은 16개의 문자를 저장할 수 있는 크기이며, 생성자를 통해 그 크기를 별도로 설정할 수 있다.