자바
자바 - 클래스 - 01
록's
2023. 1. 10. 17:17
728x90
반응형
객체 지향 프로그램
객체
- 객체(object)란 물리적으로 존재하거나 개념적인 것 중에서 다른 것과 식별 가능한 것
- 객체는 속성과 동작으로 구성. 자바는 이러한 속성과 동작을 각각 필드와 메소드라고부름
객체 지향 프로그래밍(OOP)
- 객체 객체들을 먼저 만들고, 이 객체들을 하나씩 조립해서 완성된 프로그램을 만드는 기법
객체의 상호작용
- 객체 지향 프로그램에서도 객체들은 다른 객체와 서로 상호작용하면서 동작
- 객체가 다른 객체의 기능을 이용할 때 이 메소드를 호출해 데이터를 주고받음
int result = add(10, 20);
- 매개값: 객체가 전달하고자 하는 데이터이며, 메소드 이름과 함께 괄호() 안에 기술
- 리턴값: 메소드의 실행의 결과이며, 호출한 곳으로 돌려주는값
메소드(매개값1, 매개값2, ...);
객체 간의 관계
- 집합 관계 : 완성품과 부품의 관계
- 사용 관계 : 다른 객체의 필드를 읽고 변경하거나 메소드를 호출하는 관계
- 상속 관계 : 부모와 자식 관계. 필드, 메소드를 물려받음
객체 지향 프로그래밍의 특징
- 캡슐화 : 객체의 데이터(필드), 동작(메소드)을 하나로 묶고 실제 구현 내용을 외부에 감추는 것
- 상속 : 부모객체가 자기 필드와 메소드를 자식 객체에 물려줘 자식 객체가 사용할 수 있게 함 -> 코드 재사용성 높이고 유지보수 시간 최소화
- 다형성 : 사용 방법은 동일하지만 실행 결과가 다양함
객체와 클래스
클래스와 인스턴스
- 객체 지향 프로그래밍에서도 객체를 생성하려면 설계도에 해당하는 클래스가 필요
- 클래스로부터 생성된 객체를 해당 클래스의 인스턴스라고 부름
- 클래스로부터 객체를 만드는 과정을 인스턴스화라고 함
- 동일한 클래스로부터 여러 개의 인스턴스를 만들 수 있음
클래스 선언
클래스 선언 -> (설계도 작성)
- 객체를 생성(생성자)하고, 객체가 가져야 할 데이터(필드)가 무엇이고, 객체의 동작(메소드)은 무엇인지를 정의
- 클래스 선언은 소스 파일명과 동일하게 작성
// 클래스 선언
public class 클래스명 {
}
- 클래스명은 첫 문자를 대문자로 하고 캐멀 스타일로 작성. 숫자를 포함해도 되지만 첫 문자는 숫자가 될 수 없고, 특수 문자 중 $, _ 를 포함할 수 있음
- 공개 클래스 : 어느 위치에 있든지 패키지와 상관없이 사용할 수 있는 클래스
객체 생성과 클래스 변수
클래스 변수
- 클래스로부터 객체를 생성하려면 객체 생성 연산자인 new가 필요
- new 연산자는 객체를 생성시키고 객체의 주소를 리턴
클래스 변수 = new 클래스();
- 라이브러리 클래스: 실행할 수 없으며 다른 클래스에서 이용하는 클래스
- 실행 클래스 : main() 메소드를 가지고 있는 실행 가능한 클래스
클래스의 구성 멤버
생성자, 필드, 메소드
- 필드 : 객체의 데이터를 저장하는 역할. 선언 형태는 변수 선언과 비슷하지만 쓰임새는 다름
- 새성자 : new 연산자로 객체를 생성할 때 객체의 초기화 역할. 선언 형태는 메소드와 비슷하지만, 리턴 타입이 없고 이름은 클래스 이름과 동일
- 메소드 : 객체가 수행할 동작. 함수로도 불림
필드 선언과 사용
필드 선언
- 필드는 클래스 블록에서 선언되어야 함
타입 필드명 [ = 초기값 ] ;
- 타입은 필드에 저장할 데이터의 종류를 결정. 기본 타입, 참조 타입 모두 가능
- 초기값을 제공하지 않을 경우 필드는 객체 생성 시 자동으로 기본값으로 초기화
분류 | 데이터 타입 | 기본값 | |
기본타입 | 정수타입 | byte char short int long |
0 \u0000 (빈 공백) 0 0 0L |
실수타입 | float double |
0.0F 0.0 |
|
논리타입 | boolean | false | |
참조 타입 | 배열 클래스(String 포함) 인터페이스 |
null null null |
필드 사용
- 필드값을 읽고 변경하는 것. 클래스로부터 객체가 생성된 후에 필드를 사용할 수 있음
- 필드는 객체 내부의 생성자와 메소드 내부에서 사용할 수 있고, 객체 외부에서도 접근해서 사용할 수 있음
생성자 선언과 호출
기본생성자
- 클래스에 생성자 선언이 없으면 컴파일러는 기본 생성자를 바이트코드 파일에 자동으로 추가
[public] 클래스() { }
생성자 선언
- 객체를 다양하게 초기화하기 위해 생성자를 직접 선언할 수 있음
클래스(매개변수, ...) {
//객체에서 초기화 코드
}
- 생성자는 메소드와 비슷한 모양을 가지고 있으나, 리턴 타입이 없고 클래스 이름과 동일
- 매개변수의 타입은 매개값의 종류에 맞게 작성
필드 초기화
- 객체마다 동일한 값을 갖고 있다면 필드 선언 시 초기값을 대입하는 것이 좋고, 객체마다 다른 값을 가져야 한다면 생성자에서 필드를 초기화하는 것이 좋음
생성자 오버로딩
- 매개변수를 달리하는 생성자를 여러 개 선언하는 것
- 매개변수의 타입, 개수, 선언된 순서가 똑같을 경우 매개변수 이름만 바꾸는 것은 생서자 오버로딩이 아님
- 생성자가 오버로딩되어 있을 경우, new 연산자로 생성자를 호출할 때 제공되는 매개값의 타입과 수에 따라 실행될 생성자가 결정
다른 생성자 호출
- 생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드가 발생할 수 있음
- 이 경우 공통 코드를 한 생성자에만 집중적으로 작성하고, 나머지 생성자는 this(...)를 사용해 공통 코드를 가진 생성자를 호출
Car(String model) {
this(model, "은색", 250);
}
Car(String model, String color) {
this(model, color, 250);
}
Car(String model, String color, int maxSpeed) {
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
메소드 선언과 호출
메소드 선언
- 객체의 동작을 실행 블록으로 정의하는 것.
- 리턴 타입 : 메소드 실행 후 호출한 곳으로 전달하는 결과값의 타입
- 메소드명 : 메소드명은 첫 문자를 소문자로 시작하고, 캐멀 스타일로 작성
- 매개변수 : 메소드를 호출할 때 전달한 매개값을 받기 위해 사용
- 실행 블록 : 메소드 호출 시 실행되는 부분
메소드 호출
- 메소드 블록을 실제로 실행하는 것
- 클래스로부터 객체가 생성된 후에 메소드는 생성자와 다른 메소드 내부에서 호출될 수 있고, 객체 외부에서도 호출될 수 있음
- 외부 객체에서는 참조 변수와 도트(.)연산자로 호
가변길이 매개변수
- 메소드가 가변길이 매개변수를 가지고 있다면 매개변수의 개수와 상관없이 매개값을 줄 수 있음
int sum(int ... values) {
}
- 메소드 호출시 매개값을 쉼표로 구분해서 개수와 상관없이 제공 할 수 있음
- 매개값들은 자동으로 배열 항목으로 변환되어 메소드에서 사용됨
int[] values = {1, 2, 3};
int result = sum(values);
int result = sum(new int[] {1, 2, 3});
return 문
- 메소드의 실행을 강제 종료하고 호출한 곳으로 돌아간다는 의미
- 메소드 선언에 리턴 타입이 있을 경우에는 return 문 뒤에 리턴값을 추가로 지정해야함
- return 문 이후에 실행문을 작성하면 'Unreachable code' 라는 컴파일 에러가 발생
메소드 오버로딩
- 메소드 이름은 같되 매개변수의 타입, 개수, 순서가 다른 메소드를 여러 개 선언하는 것
728x90
반응형