프로그래머스 자바 입문 강의를 학습 목적으로 정리하여 포스팅합니다.
1. 클래스 선언
객체지향 언어 : 프로그램을 구성하는 요소는 객체이며 이것이 상호작용되도록 프로그래밍한다.
클래스는 객체를 만들기 위한 일종의 틀
캡슐화 : 관련된 내용을 모아서 가지고 있는 것
// Car 클래스 생성
public class Car{
}
// Car 객체(인스턴스)를 참조하는 변수 c1, c2 선언
public class CarExam{
public static void main(String args[]){
Car c1 = new Car();
Car c2 = new Car();
}
}
2. 참조 타입
참조형 타입은 기본형 타입을 제외한 모든 타입 ex) 배열, 클래스
String str = new String("hello");
- 메모리에 올라간 인스턴스를 가리키는 변수, 참조하는 변수, 레퍼런스 하는 변수가 str
- 레퍼런스 한다라는 것은 변수가 인스턴스를 가지고 있는게 아니라 말그대로 가리킨다는 의미
- str이라는 변수에는 메모리의 위치값이 저장된다. 메모리의 위치값이 저장된다고 하더라도, 어떤 메모리에 저장되는지 그 정보를 알 수 있는 방법은 없다. 그렇기 때문에 str변수는 String 인스턴스를 참조한다라고 알면 된다.
3. String 클래스
문자열을 표현하는 자바에서 가장 많이 사용하는 클래스
1. new 연산자를 이용하지 않고 인스턴스를 만드는 경우
String str1 = "hello";
String str2 = "hello";
- “hello”라는 문자열이 메모리 중에서 상수가 저장되는 영역에 저장된다. 상수는 변하는 않는 값을 의미한다.
- String str2 = “hello”; 이 문장이 실행될 때에 hello라는 문자열 상수는 이미 만들어져 있으므로 str1이 참조하는 인스턴스를 str2도 참조한다
2. new 연산자를 이용해서 인스턴스를 만드는 경우
String str3 = new String("hello");
String str4 = new String("hello");
- new 연산자를 이용하여 인스턴스를 만들면 인스턴스는 무조건 새롭게 만들어진다.
- String str4 = new String(”hello”); 이 문장이 실행될 때도 새롭게 만들게 되므로, str3와 str4는 서로 다른 인스턴스를 참조
참조변수끼리 ==로 비교하면 같은 인스턴스를 참조하는지 비교
값을 비교하고 싶다면 ex) str1.equals(str2)
String은 다른 클래스와 다르게 new를 사용하지 않고 사용할 수 있기에 메모리를 아끼려면 new를 사용하지 않고 사용하는 것이 좋다.
String은 불변 클래스이다. 불변이란 String이 인스턴스가 될 때 가지고 있던 값을 나중에 수정할 수 없다.
String은 문자열과 관련된 다양한 메소드를 가지고 있다. 메소드를 호출한다 하더라도 String은 내부의 값이 변하지 않는다.
String이 가지고 있는 메소드 중 String을 반환하는 메소드는 모두 새로운 String을 생성해서 반환한다.
String str5 = "hello world";
String str6 = str5.substring(3);
- substring()은 문자열을 자른 결과를 반환하는 메소드이다. 해당 코드가 실행되어도 str5는 변하지 않는다.
- str6는 str5가 가지고 있는 문자열 중 3번째 위치부터 자른 결과 즉 새로운 String을 참조하게 된다.
4. 필드(field) 선언
// 이름과 번호를 필드로 가지고 있는 Car 클래스 선언
public class Car{
String name;
int number;
}
// Car 클래스를 인스턴스화 후 속성 이용하기
Car c1 = new Car();
Car c2 = new Car();
// Car라는 인스턴스가 메모리에 2개 만들어짐
// 객체별로 name과 number라는 속성을 가짐
c1.name = "소방차"; // c1이 참조하는 객체의 name을 소방차로 설정
c1.number = 1234;
System.out.println(c1.name); // 소방차
// c2가 참조하는 객체의 name을 String 타입 변수 name도 참조하게 함
String name = c1.name;
5. 메소드란?
메소드는 입력값이 있고, 그 입력값을 받아서 무언가 한 다음 결과를 도출해내는 수학의 함수와 비슷한 개념
이때 입력값을 매개변수라고 하고, 결과값을 리턴값이라고 한다
- 인자(Argument)는 어떤 함수를 호출 시에 전달하는 값을 의미
- 매개변수(Parameter)는 그 전달된 인자를 받아들이는 변수를 의미
메소드란 클래스가 가지고 있는 기능이라 클래스 안에 선언된다
6. 메소드(Method) 선언
public class MyClass{
// 매개변수X 리턴값X
public void method1(){
System.out.println("method1이 실행됩니다.");
}
// 매개변수O 리턴값X
public void method2(int x, int y){
System.out.println(x +"와 " + y + " 를 이용하는 method2입니다.");
}
// 매개변수X 리턴값O
public int method3(){
System.out.println("method3이 실행됩니다.");
return 10;
}
}
7. 메소드 사용해보기
public class MyClassExam{
public static void main(String args[]){
MyClass my1 = new MyClass();
my1.method1();
my1.method2(10, 20);
int x = my1.method3();
}
}
8. String 클래스의 메소드
// 문자열 길이 구하기
System.out.println(str.length()); // int타입으로 리턴
// 문자열 붙히기
String str = new String("hello");
System.out.println(str.concat(" world"); // hello world
System.out.println(str); // hello
// 문자열 자르기
System.out.println(str.sunstring(1, 3)); // el
System.out.println(str.substring(2)); // llo world
9. 변수의 scope와 static
변수가 선언된 블럭이 그 변수의 사용범위(scope)
// 예1
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);
}
// main은 static한 메소드
// static한 메소드에서는 static하지 않은 필드 사용 X
public static void main(String[] args){
System.out.println(globalScope); // 오류
System.out.println(localScope); // 오류
System.out.println(value); // 오류
}
}
// 예2
// 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한 변수는 하나
// 클래스 변수라고 부른다
VariableScopeExam v1 = new VariableScopeExam();
VariableScopeExam v2 = new VariableScopeExam();
v1.globalScope = 20;
v2.globalScope = 30;
System.out.println(v1.globalScope); // 20
System.out.println(v2.globalScope); // 30
v1.staticVal = 10; // VariableScopeExam .staticVal 권장
v2.staticVal = 20;
System.out.println(v1.staticalVal); // 20
System.out.println(v2.staticalVal); // 20
Static은 프로그램 종료 전까지 사용이 가능하다는 특징이 있다.
또한 가비지 컬렉션에 잡히지 않기 때문에 너무 많은 사용은 좋지 않다.
보통 상수나 유틸리티 클래스를 정의하는 데에 사용된다.
10. 열거형(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이 아닌 다른 값이 들어오게 되므로 문제를 발생시킬 수 있다
해결 방법 → 열거형
특정 값만 가져야 하는 경우 열거형 사용
// Gender 타입의 변수에는 MALE, FEMALE 외 다른 값은 저장 불가능
enum Gender{
MALE, FEMALE;
}
Gender gender2;
gender2 = Gender.MALE;
gender2 = Gender.FEMALE;
'JAVA > [프로그래머스] 자바 강의' 카테고리의 다른 글
[프로그래머스] 자바 입문 강의 part7. 상속 (0) | 2023.01.16 |
---|---|
[프로그래머스] 자바 입문 강의 part6. 클래스 다듬기 (1) | 2023.01.16 |
[프로그래머스] 자바 입문 강의 part4. 배열 (0) | 2023.01.16 |
[프로그래머스] 자바 입문 강의 part3. 제어문 (0) | 2023.01.16 |
[프로그래머스] 자바 입문 강의 part2. 변수와 계산 (0) | 2023.01.16 |