String클래스의 메소드
String Class가 제공하는 메소드 이용하기
문자열 길이 구하기_공백도 하나의 문자로 인식
str.length()는 str이 참조하는 문자열의 길이를 구해서 int 타입으로 리턴해주는 메소드 이다.
System.out.println(str.length()); //str
문자열 붙히기 (concat)
str.concat("world") 메소드는 str 이 참조하는 문자열 hello 에다가 메소드의 인자로 들어온 문자열 world 를 붙혀서 String 타입으로 리턴하는 메소드다.
String Class는 불변 클래스로, 메소드가 수행되면, 새로운 문자열을 만든다. 그러므로, 원래 클래스는 변하지 않는다.
String str = new String("hello");
System.out.println(str.concat(" world")); //출력결과는 hello world _str 자체는 바뀌지 않음
System.out.println(str); //출력결과는 hello
str= str.concat(" world"); __이렇게 한번더 지정해서 써주면 str의 값은 바뀜
System.out.println(str); //출력결과는 hello world
문자열 자르기 (subString)
str.subString(1,3) 은 str이 참조하는 문자열을 인덱스 1번부터 3번까지 자른 결과이다.
str.subString(2) 은 str이 참조하는 문자열을 2번 인덱스부터 마지막까지 자른 결과를 의미한다.
문자열의 인덱스는 0번 부터 시작한다. _공백포함
System.out.println(str.substring(1, 3)); //출력결과 el
System.out.println(str.substring(2)); //출력결과 llo world
ex)
public class StringExam {
public static void main(String[] args) {
String str1 = "안녕하세요. ";
String str2 = "벌써 여기까지 오셨네요. 끝까지 화이팅!!";
String concatResult;
String substringResult;
// 아래쪽에 코드를 작성하세요.
concatResult = str1.concat(str2);
// 부분 문자열 추출 (인덱스 2부터 끝까지)
substringResult = str1.substring(2);
// 이 아래는 정답 확인을 위한 코드입니다. 수정하지 마세요.
System.out.println(concatResult);
System.out.println(substringResult);
}
}
변수의 scope와 static
변수의 스코프
프로그램상에서 사용되는 변수들은 사용 가능한 범위를 가진다. 그 범위를 변수의 스코프라고 한다.
변수가 선언된 블럭이 그 변수의 사용범위이다.
public class ValableScopeExam{
int globalScope = 10; // 인스턴스 변수
public void scopeTest(int value){
int localScope = 10;
System.out.println(globalScope);
System.out.println(localScpe);
System.out.println(value);
}
}
클래스의 속성으로 선언된 변수 globalScope 의 사용 범위는 클래스 전체 이다.
매개변수로 선언된 int value 는 블럭 바깥에 존재하기는 하지만, 메서드 선언부에 존재하므로 사용범위는 해당 메소드 블럭내이다.
메소드 블럭내에서 선언된 localScope 변수의 사용범위는 메소드 블럭내이다.
main메소드에서 사용하기
같은 클래스 안에 있는데 globalScope 변수를 사용 할 수 없다.
main은 static한 메소드이다. static한 메서드에서는 static 하지 않은 필드를 사용 할 수 없다.
사용할려면 스테틱안에서 다시 선언 해줘야함
public class VariableScopeExam {
int globalScope = 10;
public void scopeTest(int value){
int localScope = 20;
System.out.println(globalScope);
System.out.println(localScope);
System.out.println(value);
}
public static void main(String[] args) {
System.out.println(globalScope); //오류_해당클래스내에 있지만 static을 사용해서 불가 , 인스턴스화 하지 않아도 사용 할수 있음, static 객체를 설정해줘야함,
System.out.println(localScope); //오류 _ 블럭밖에 정보가 있어서 사용 불가
System.out.println(value); //오류
}
}
static
같은 클래스 내에 있음에도 해당 변수들을 사용할 수 없다.
main 메소드는 static 이라는 키워드로 메소드가 정의되어 있다. 이런 메서드를 static 한 메소드 라고 한다.
static한 필드(필드 앞에 static 키워드를 붙힘)나, static한 메소드는 Class가 인스턴스화 되지 않아도 사용할 수 있다.
public class VariableScopeExam {
int globalScope = 10;
static int staticVal = 7;
public void scopeTest(int value){
int localScope = 20;
}
public static void main(String[] args) {
System.out.println(staticVal); //사용가능
}
}
static한 변수는 공유된다.
static하게 선언된 변수는 값을 저장할 수 있는 공간이 하나만 생성된다. 그러므로, 인스턴스가 여러개 생성되도 static한 변수는 하나다.
ValableScopeExam v1 = new ValableScopeExam();
ValableScopeExam v2 = new ValableScopeExam();
v1.golbalScope = 20;
v2.golbalScope = 30;
System.out.println(v1.golbalScope); //20 이 출력된다.
System.out.println(v2.golbalScope); //30이 출력된다.
v1.staticVal = 10;
v2.staticVal = 20;
System.out.println(v1.statVal); //20 이 출력된다. _저장공간이 하나뿐이라 마지막값이 공유됨
System.out.println(v2.statVal); //20 이 출력된다.
golbalScope같은 변수(필드)는 인스턴스가 생성될때 생성되기때문에 인스턴스 변수라고 한다.
staticVal같은 static한 필드를 클래스 변수라고 한다.
클래스 변수는 레퍼런스.변수명 하고 사용하기 보다는 클래스명.변수명 으로 사용하는것이 더 바람직하다고 하다.
System.out.println(VariableScopeExam.staticVal);
열거형(enum)
자바는 열거타입을 이용하여 변수를 선언할 때 변수타입으로 사용할 수 있다.
열거형은 JDK5에서 추가되었다.
JDK5 이전에는 상수를 열거형 대신 사용
상수를 이용하는 방법
public class EnumExam {
public static final String MALE = "MALE"; _대분자 사용
public static final String FEMALE = "FEMALE";
public static void main(String[] args) {
String gender1;
gender1 = EnumExam.MALE;
gender1 = EnumExam.FEMALE;
}
}
상수를 사용했때의 문제점
String으로 선언된 gender1 에는 MALE,FEMALE 둘 중 한가지 값을 갖기 원하는데, gender1의 type이 String 이기 때문에 gender1 = "소년"; 이렇게 수행 되어도 전혀 문제가 되지 않는다.
실행할때 원했던 값인 MALE,FEMALE 이 아닌 다른 값이 들어오게 되므로 문제를 발생시킬 수 있다.
해결 방법
이런 문제를 발생시키지 않게 하기 위해서 열거형을 사용하시면 됩니다.
열거형 정의 방법
enum Gender{
MALE, FEMALE;
}
열거형 사용 방법
Gender gender2;
gender2 = Gender.MALE;
gender2 = Gender.FEMALE;
//Gender타입의 변수에는 MALE이나 FEMALE만 대입이 가능. 다른 값은 저장할 수가 없다.
특정 값만 가져야 한다면 열거형을 사용하는 것이 좋다.
생성자
모든 클래스는 인스턴스화 될때 생성자를 사용한다.
생성자의 특징
생성자는 리턴타입이 없다.
생성자를 프로그래머가 만들지 않으면 매개변수가 없는 생성자가 컴파일할 때 자동으로 만들어진다.
매개변수가 없는 생성자를 기본생성자라고 한다.
생성자를 하나라도 프로그래머가 만들었다면 기본생성자는 자동으로 만들어지지 않는다.
생성자의 역할
생성자가 하는 일은 객체가 될 때 필드를 초기화 하는 역할을 수행한다.
자동차가 객체가 될때 반드시 이름을 가지도록 하려면,Car클래스를 다음과 같이 만들어야 한다.
public class Car{
String name;
int number;
public Car(String n){
name = n; _name이 초기화된거임
}
}
위의 Car 클래스를 이용하여 Car 인스턴스를 생성하는 방법
public class CarExam2{
public static void main(String args[]){
Car c1 = new Car("소방차");_string 값을 넣어주면됨
Car c2 = new Car("구급차");
//Car c3 = new Car(); // 컴파일 오류가 발생합니다._초기화 했기 때문에 기본생성자를 이용할수 없음
System.out.println(c1.name);
System.out.println(c2.name);
}
}
Car클래스는 기본 생성자를 가지지 않는다. 그래서 기본생성자로 Car 객체를 생성할 수 없다.
this
this는 현재 객체, 자기 자신을 나타낸다.
this 의 사용
public class Car{
String name;
int number;
public Car(String n){
name = n;
}
}
Car클래스의 생성자 매개변수의 이름이 n 이다. n 이라는 변수명은 무엇을 의미하는지 쉽기 알수 없다.
n 으로 쓰기 보다는 name 으로 사용하는 것이 좋다.
public Car(String name){
name = name;
}
'name=name' 이라고 코드를 바꾸면, 가깝게 선언된 변수를 우선 사용하기 때문에 'name=name'이라는 코드는 매개변수의 name의 값을 매개변수 name에 대입하라는 의미가 된다.
즉, 필드는 바뀌지 않습니다. 이런 경우 필드라는 것을 컴파일러와 JVM에게 알려주기 위해서 this키워드를 사용해야 한다.
public Car(String name){
this.name = name;
}
앞의 this.name은 필드 name을 말하고 =(이퀄) 뒤의 name은 매개변수를 의미한다.
즉 매개변수의 값을 필드에 대입하라는 의미가 된다.
클래스 안에서 자기 자신이 가지고 있는 메소드를 사용할 때도 this.메소드명()으로 호출할 수 있다.