728x90
230719 객체지향 프로그래밍 - 클래스와 메소드
객체지향 프로그래밍
객체지향 프로그래밍 (OOP, Object Oriented Programming)
- 객체: 사물과 같이 유형적인 것과 개념이나 논리와 같은 무형적인 것들
- 지향: 작정하거나 지정한 방향으로 나아감
- 객체 모델링: 현실세계의 객체를 SW 객체로 설계하는 것
클래스 (Class)
- 객체를 만드는 설계도 (Blueprint)
인스턴스 (Instance)
- 클래스를 통해 생성된 객체
클래스: 붕어빵 틀
인스턴스: 붕어빵 느낌… 내가 마음대로 만드는 자료형~
객체지향 프로그래밍 특징 (A PIE)
- Abstraction (추상화)
- Polymorphism (다형성)
- Inheritance (상속): 상위 클래스가 하위 클래스에 전달
- Encapsulation (캡슐화)
객체지향 프로그래밍 장점
- 모듈화된 프로그래밍
- 재사용성이 높다
객체지향 설계 (SOLID) - 지금은 X
- S (Single responsibility principle) 단일 책임 원칙
- O (Open/closed principle) 개방-폐쇄 원칙
- L (Liskov substitution principle) 리스코프 치환 원칙
- I (Interface segragation principle) 인터페이스 분리 원칙
- D (Dependency inversion principle) 의존관계 역전 원칙
클래스
++ 패키지 이름 설정! com.ssafy.class01 등… > 회사 내부에서 사용 마니 하는데 나중에 더 ~
사람의 정보를 관리할 때, name
, age
, hobby
등 다양한 정보를 한 변수에 넣어서 관리하고 싶다면?
클래스에 넣으면 된다!
배열 → 같은 자료형의 정보를 저장하기 위한 것이라 사람 정보 같은 걸 저장하는 데에는 그닥 .. 좋지 않음
public class Person {
String name;
int age;
String hobby;
// 이 안에 저장되는 변수는 주소도 참조하고 있음 (참조 자료형임)
public void into() {
System.out.println("나의 이름은 " + name + "입니다.");
System.out.println("나이는 "+age+"세, 취미는 "+hobby+"입니다.");
}
}
클래스란?
- 관련 있는 변수와 함수를 묶어서 만든 사용자정의 <자료형>
- 모든 객체들의 생산처
- 클래스 == 객체를 생성하는 틀
- 프로그래밍이 쓰이는 목적을 생각하여 어떤 객체를 만들어야 하는지 결정한다.
- 각 객체들이 어떤 특징 (속성과 동작-method) 을 가지고 있을지 결정한다.
- 클래스를 통해 생성된 객체를 인스턴스라고 한다.
- 객체들 사이에서 메시지를 주고받도록 만들어 준다.
클래스 구성
- 속성 (Attribute) - 필드
- 동작 (Behavior) - 메소드
- 생성자 (Constructor)
- 중첩 클래스 (클래스 내부의 클래스)
클래스 선언 및 객체의 생성
[접근제한자 public/default] [활용제한자 final/abstract] class 클래스명 {
속성 정의 (필드)
기능 정의 (메소드)
생성자
}
ex)
public class Person {
String name;
int age;
public void eat () {
}
public Person () {
}
}
- 클래스명 변수명 = new 클래스명();
- 변수명.필드명
- 변수명.메서드명();
변수
클래스 변수 (class variable)
- 클래스 영역 선언 (static 키워드)
- → static: 미리 쓰려면 static 이라는 키워드를 써야 돼~
- 생성시기: 클래스가 메모리에 올라갔을 때
- 모든 인스턴스가 공유함
인스턴스 변수 (instance variable)
- 클래스 영역 선언
- 생성시기: 인스턴스가 생성되었을 때 (new)
- 인스턴스별로 생성됨
지역 변수 (local variable)
- 클래스 영역 이외 (메서드, 생성자 … 등)
- 생성시기: 선언되었을 때
함수 (Function)
)
)
1~6 : 명령어
명령어들의 묶음: 프로그래밍, 이것을 만드는 것이 프로그래밍
메소드
메소드 (Method)
- 객체가 할 수 있는 행동을 정의
- 어떤 작업을 수행하는 명령문의 집합에 이름을 붙여 놓은 것
- 메소드의 이름은 소문자로 시작하는 것이 관례
// 접근제한자: public/protected/default/private
// 활용제한자: static/final/abstract/synchronized
[접근제한자] [활용제한자] 반환값 메소드 이름([매개변수들]) {
행위 기술...
}
public static void main (String [] args) {
흐흐
}
메소드 선언
- 선언시
{}
안에 메소드가 해야 할 일을 정의
메소드 호출
- 호출한 메소드가 선언되어 있는 클래스를 접근한다
클래스 객체.메소드
이름으로 호출Person.hello();
매개변수 (Parameter)
- 메소드에서 사용하는 것
인자 (Argument)
- 호출하는 쪽에서 전달하는 것
→ 매개변수 생략 가능
public void study(int time) {
// int time = ?
// 파라미터는 해당 위치에 선언한 지역변수
System.out.println(time+"시간 공부.");
}
Person p = new Person();
p.study(10);
→ 파라미터 전달 시 묵시적 형 변환
p.study((byte) 10); // O
p.study((short) 10); // O
p.study(10); // O
p.study(10L); // X
p.study(10.0f); // X
p.study(10.0); // X
p.study(10, 10) // X
메소드 리턴
- 리턴 타입은 메소드를 선언할 때 지정, 없다면
void
(return
문 생략 가능) - 리턴 타입을 작성했다면 반드시 해당 타입의 값을 리턴
- 리턴 타입은 하나만 적용 가능
public int getAge() { return age; } Person p = new Person(); p.name = "Yang"; p.age = 45; p.hobby = "유튜브"; int age = p.getAge();
메소드 오버로딩 (Overloading)
ex) println
- 이름이 같고 매개변수가 다른 메소드를 여러 개 정의하는 것
- 중복 코드에 대한 효율적 관리 가능
- 파라미터의 개수 또는 순서, 타입이 달라야 할 것 (파라미터 이름만 다른 것은 X)
- 리턴 타입이 다른 것은 의미 X
클래스와 객체
- 클래스: 관련 있는 변수와 함수를 묶어 만든 사용자 정의 자료형
- 객체: 하나의 역할을 수행하는 ‘메소드와 변수(데이터)’의 묶음
- 객체지향 프로그래밍: 프로그램을 단순히 데이터와 처리하는 방법으로 나누는 것이 아니라, 프로그램을 수많은 ‘객체(object)’라는 기본 단위로 나누고 이들의 상호작용으로 서술하는 방식
생성자
생성자 메서드
- new 키워드와 함께 호출하여 객체 생성!
- 클래스에 해당하는 걸 새로 만들기 위해서 무조건 하나 있어야 하는 것… (선언할 때 필요하고, 기본 생성자/인자를 받는 생성자 두 개 중 하나만 고르면 댐)
- 클래스명과 동일
- 결과형 리턴값을 갖지 않음
- 객체가 생성될 때 반드시 하나의 생성자 호출
- 멤버필드의 초기화에 주로 사용
- 하나의 클래스 내부에 생성자가 하나도 없으면 자동적으로 default 생성자가 있는 것으로 인지
- default 생성자: 매개변수도 없고 내용도 없는 생성자
- 매개변수의 개수가 다르거나, 자료형이 다른 여러 개의 생성자가 있을 수 있음 (생성자 오버로딩)
- 생성자의 첫 번째 라인으로 this() 생성자를 사용하여 또 다른 생성자를 하나 호출 가능
- 클래스 명과 이름이 동일 (대.소문자)
- 반환타입이 없다 (void 작성 X)
public class Dog { public Dog() { System.out.println("기본 생성자!"); System.out.println("클래스 이름과 동일하고 반환타입 X"); } }
생성자 특징
기본(디폴트) 생성자
- 클래스 내에 생성자가 하나도 정의되어 있지 않을 경우 JVM이 자동으로 제공하는 생성자
- 형태: 매개변수가 없는 형태, 클래스 명 () { }
class Main { public static void main(String[] a) { // 객체 생성 Dog d = new Dog(); } }
class Dog { 생성자가 하나도 없는 상태임 JVM이 자동으로 제공함 ??? Dog () { } }
파라미터가 있는 생성자
- 생성자의 목적이 필드 초기화
- 생성자 호출 시 값을 넘겨주어야 함
- 해당 생성자를 작성하면 JVM에서 기본 생성자를 추가하지 않음
class Main { public static void main(String [] a) { Dog d1 = new Dog(); d1.name = "쫑"; d1.age = 3; Dog d2 = new Dog("메리", 4); } }
class Dog { String name; int age; Dog (String n, int a) { name = n; age = a; } }
생성자 오버로딩을 지원한다
- 클래스 내에 메소드 이름이 같고 매개변수의 타입 또는 개수가 다른 것
class Dog {
Dog() { }
Dog(String name) { }
Dog(int age) { }
Dog(String name, int age) { }
}
class Main {
public static void main(String [] a) {
Dog d = new Dog();
Dog d2 = new Dog("쫑");
Dog d3 = new Dog(3);
Dog d4 = new Dog("메리", 4);
}
}
this
- 참조 변수로써 객체 자신을 가리킴
- this를 사용하여 자신의 멤버에 접근 가능
- 지역변수(매개변수)와 필드의 이름이 동일할 경우 필드임을 식별할 수 있게 함
- 객체에 대한 참조이므로 static 영역에서 this 사용 불가
this의 활용
- this.멤버변수
- this ([인자값..]): 생성자 호출
- this 생성자 호출 시 제한사항
- 생성자 내에서만 호출이 가능함
- 생성자 내에서 첫번째 구문에 위치해야 함
class Dog {
String name;
int age;
void info() {
System.out.print(this.name);
System.out.println(this.age);
}
}
// 이름이랑 나이가 출력되겟지
class Dog {
String name;
int age;
Dog() {
this(“쫑”); → 오류발생
}
Dog ( String name ) {
}
}
728x90
'Java > 기본 문법' 카테고리의 다른 글
JAVA 객체지향 프로그래밍 - 상속 (0) | 2023.08.10 |
---|---|
JAVA 객체지향 프로그래밍 - 객체 (0) | 2023.08.09 |
JAVA 문법: 배열 (0) | 2023.08.09 |
JAVA 기본 문법: 변수와 자료형, 형 변환, 연산자, 제어/반복문 (0) | 2023.07.25 |
JAVA 기본 문법: JVM, 출력, main method, 출력 (0) | 2023.07.25 |