- 클래스는 상태(멤버 변수)와 동작(메서드)을 가지고 있음
- 메서드(method): 클래스 안에 있는 함수
- Java는 모든 것을 클래스 기반으로 작성하기 때문에 함수도 클래스 안에 위치
- 지역 변수는 Stack 영역에 생성
- static 변수/메서드는 Static 영역에 생성
- 참조 타입은 Heap영역에 생성
클래스
클래스
- 클래스명은 PascalCase
- 클래스는 멤버 변수(상태)와 메서드(동작)을 가지고 있음
- Java는 객체 지향 언어(OOP)이고 Java의 모든 것은 클래스 안에 존재
- 클래스 인스턴스화시 변수는 클래스 인스턴스의 메모리 주소(Heap 위치)로 초기화
클래스 정의
public class ClassName{
type member_var = value; // 멤버 변수(상태)
public ClassName() { // 생성자
}
public ClassName(type param1) { // 생성자
this.member_var = param1;
}
public type method(type param1, type param2) { // 메서드(동작)
실행되는 코드;
return value; // 반환 값;
}
public static void main(String[] args) {
실행되는 코드;
}
}
클래스 생성(인스턴스화)
ClassName classVar = new ClassName();
ClassName classVar = new ClassName(value1, ...);
멤버변수 접근
className.member_var;
클래스 예시
public class Dog {
String name;
public Dog(String name) {
this.name = name;
}
}
public class DogTest {
public static void main(String[] args) {
Dog d1 = new Dog("Henry");
System.out.println(d1.name);
}
}
메서드
메서드
- 메서드명은 camelCase
- 클래스 내에 위치
- 메서드 사용시 중복 코드 제거
- 메서드 구성요소: 접근 제어자, 리턴 타입, 메서드명
- 접근 제어자: 메서드를 호출할 수 있는 범위. public, protected, default, private. 메서드, 클래스, 변수에서 사용
- 접근 제어자는 가독성을 위해 명시적으로 사용
+) 캡슐화: 서로 연관 있는 변수나 메서드를 하나의 클래스로 묶어 외부에서 쉽게 접근하지 못하도록 하는 것
+) 패키지는 디렉토리를 의미
접근 제어자 종류
접근 제어자 | 설명 |
public | 모든 클래스에서 접근 가능 / 다른 패키지에서도 접근 가능 |
protected | 같은 패키지 내의 클래스와 해당 클래스를 상속한 외부 패키지의 클래스에서 접근 가능 |
default | 접근 제어자를 쓰지 않는 경우 기본값 / 같은 패키지 내의 클래스에서만 접근 가능 |
private | 해당 클래스 내부에서만 접근 가능 |
변수 접근 제어자
접근제어자 type varName;
- 리턴 타입: 메서드를 실행한 결과가 가지는 타입. 원시 타입(primitive type)과 참조 타입(reference type). return으로 결과 반환 필요. 리턴한 결과가 없다면 void 사용
- 메서드명: 메서드의 이름으로 메서드 호출시 사용
- 메서드명 기능을 유추할 수 있도록 작성. camelCase로 작성. 동사 포함. is의 경우 boolean 리턴
- return: 리턴값을 반환하거나 함수 종료
- 매개변수(parameter): 메서드에 전달된 값을 저장하는 변수. 타입을 지정해야 함
- 인수(argument): 메서드 호출시 전달되는 값
- 메서드 인수 전달시 (매개변수 개수 > 인수 개수) 또는 (매개변수 개수 < 인수 개수)라면 예외 발생
- Java에서 Primitive Type으로 매개변수 전달시 Call by Value(값이 복사되어 전달) 방식을 사용
- Java에서 Reference Type으로 매개변수 전달시 Call by Reference(주소가 복사되어 전달) 방식을 사용
메서드 선언
public class ClassName {
...
접근제어자 type methodName() {
return 반환값;
}
}
메서드 호출
public class Main {
public static void main(String[] args) {
ClassName className = new ClassName(); // 클래스 인스턴스화
ClassName className = new ClassName(arg1, ...);
className.method(); // 메서드 호출
type varName = className.method(); // 메서드 호출. 리턴값 반환
}
}
메서드 선언(매개변수)
public class ClassName {
...
접근제어자 type methodName(type param1, ...) {
return 반환값;
}
}
메서드 호출(인수 전달)
public class Main {
public static void main(String[] args) {
ClassName className = new ClassName();
ClassName className = new ClassName(arg1, ...); // 클래스 인스턴스화
className.method(arg1, ...); // 메서드 호출
type varName = className.method(arg1, ...); // 메서드 호출. 리턴값 반환
}
}
메서드 예시
public class Dog {
public void bark() { // 메서드 정의
System.out.println("bowwow");
}
public static void main(String[] args) {
Dog holl = new Dog(); // 클래스 인스턴스화
holl.bark(); // 메서드 호출
}
}
메서드 예시2
public class Calculator {
public void add(int x, int y) { // 메서드 정의
return x + y;
}
public void sub(int x, int y) {
return x - y;
}
}
public classs CalculatorTest {
pulbic static void main(String[] args) {
Calculator calculator = new Calculator(); // 클래스 인스턴스화
int addResult = calculator.add(3, 4); // 메서드 호출
int subResult = calculator.sub(2, 5);
System.out.println(addResult);
System.out.println(subResult);
}
}
메인메서드
- Java에서는 메인 메서드를 가장 먼저 찾아서 실행
- static이 붙은 클래스, 변수, 메서드는 Java Application이 시작될 때 인스턴스화가 되고 Java 프로글이 종료 될 때 제거
- static이 없는 일반 클래스는 Garbage Collection의 대상
- 메인 메서드 구성요소: 접근제어자, static, 리턴타입, 메서드명, 매개변수
- 접근제어자는 public이여야 JVM에서 접근 가능
- static 키워드 사용한 객체는 메모리의 static 영역에 컴파일되는 순간 인스턴스화됨
- 메인 메서드를 호출하는 곳은 JVM이 유일하고 단 한번의 호출을 함. 메임메서드의 용도는 Java Application의 시작점.
- JVM은 리턴값을 요구하지 않으므로 리턴 타입은 viod로 고정
- 메서드명은 main으로 고정. 싱행후 main이라는 이름을 찾기 때문
- 매개변수 String[] args는 Java 프로그램 실행시 특정 값을 전달받는 매개변수
Static 메서드
- static을 붙이면 JVM 실행시 인스턴스를 생성하므로 new를 이용하여 인스턴스를 생성하지 않고 모든 곳에서 메서드 호출 가능
- 정적 메서드(static method): static을 붙여 선언하는 메서드. 여러 곳에서 사용하는 유틸리티 메서드 작성시 사용
static method 선언
public class ClassName {
접근제어자 static type staticMethod() {
실행되는 코드;
}
}
static method 호출
ClassName.staticMethod(arg1, ...);
static method 예시
public class Calculator {
public static int add(int x, int y) { // static method 선언
return x + y;
}
public static void main(String[] args) {
int result = Calculator.add(3,5);
System.out.println(result);
}
}
Getter, Setter 메서드
- Java에서는 클래스의 멤버 변수의 접근 제어자로 private를 주로 사용
- getter, setter 메서드를 사용하여 private로 선언된 멤버 변수에 접근
- getter, setter는 멤버 변수에 직접 접근을 피하기 위해 사용
- getter: 해당 멤버 변수의 값을 가져오는데 사용. 일반적으로 get변수이름() 형식
- setter: 해당 멤버 변수의 값을 설정하는데 사용. 일반적으로 set변수이름(값) 형식
getter, setter 메서드 정의
public class ClassName {
private type memberVar;
public type getMemberVar() {
return memberVar;
}
public void setMemberVar(type param1) {
this.memberVar = param1;
}
}
getter, setter 호출
ClassName className = new ClassName();
className.getMemberVar();
className.setMemberVar(arg1);
getter, setter 예시
public class Person {
private String name;
private int age;
private int height;
private int weight;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class PersonTest {
public static void main(String[] args) {
Person person = new Person();
person.setName("Henry");
System.out.println(person.getName());
}
}
메서드 오버로딩
- 객체 지향 프로그래밍(OOP)는 현실을 객체로 구현할 때 overloading을 사용
- method overloading: 객체 지향 프로그래밍에서 동일한 이름을 가진 메서드를 여러개 정의하는 것. 메서드명은 동일하지만 호출시 전달되는 매개변수의 종류와 개수, 순서에 따라 다르게 동작. 리턴 타입은 영향을 주지 않음
- method overriding: 메서드명과 매개변수의 종류, 개수, 순서가 동일한 것
메서드 오버로딩 정의
public class ClassName {
public type method(type param1, type param2) {
return param1 + param2;
}
public type method(type param1, type param2, type param3) { // 메서드 오버로딩
return param1 + param2 + param3;
}
}
메서드 오버로딩 호출
ClassName className = new ClassName();
className.method(arg1, arg2);
className.method(arg1, arg2, arg3);
메서드 오버로딩 예시
public class Calculator {
public int add(int x, int y) {
return x + y;
}
public int add(int x, int y, int z) {
return x + y + z;
}
public double add(double x, double y) {
return x + y;
}
}
public class CalculatorTest {
public static void main(String[] args) {
Calculator calculator = new Calculator();
int result1 = calculator.add(3, 6);
int result2 = calculator.add(1, 3, 6);
double result3 = calculator.add(1.0, 4.0);
System.out.println(result1);
System.out.println(result2);
System.out.println(result3);
}
}
'Java(17+) 문법 > Java 기본' 카테고리의 다른 글
[Java] 예외처리 (0) | 2025.01.22 |
---|---|
[Java] 제네릭/Enum (0) | 2025.01.22 |
[Java] 클래스 - 생성자/상속/추상클래스 (0) | 2025.01.21 |
[Java] 제어문 (0) | 2025.01.21 |
[Java] 참고자료 (0) | 2025.01.20 |