JAVA 문법#2
객체지향 프로그래밍(Object Oriented Programming)
- 객체: 주체가 아닌 것, 주체가 활용하는 것
우리 주변에 있는 모든 것 - 객체지향 프로그래밍
- 주변에 있는 것들을 객체화해서 프로그래밍 하는 것
OOP의 장점
- 재사용성 증가.
- 추가/수정/삭제가 편리.
- 신뢰성 높은 프로그래밍 가능.
현실의 객체, 클래스, 프로그램에서의 객체
실생활에서 구체화 되어있는 현실의 객체의 속성과 기능을 추상화(abstraction)하여 클래스에 정의.
클래스는 구체화 되어 프로그램의 객체(object, instance)가 됨.
- 클래스(class): 객체를 정의해 놓은 틀. 객체를 생성하기 위한 틀.
- 객체(object, instance): 클래스를 이용하여 메모리에 생성된 것.
ex) Dog 클래스
public class Dog {
String species;
int age;
String name;
void eat() {
System.out.println("밥먹는다 멍멍");
}
void shout() {
System.out.println("짖는다 왈왈!");
}
}
// 클래스 사용
public class DogTest {
public static void main(String args[]) {
Dog dog1 = new Dog(); // 객체 생성
dog1.species = "pomeranian";
dog1.age = 3;
do1.name = "폼폼";
dog1.eat(); // 밥먹는다 멍멍
dog1.shout(); // 짖는다 왈왈!
Dog dog2 = new Dog(); // 객체 생성
dog1.species = "yorkshire terrier";
dog1.age = 2;
do1.name = "욬욬";
dog1.eat(); // 밥먹는다 멍멍
dog1.shout(); // 짖는다 왈왈!
// dog1과 dog2는 각각 다른 강아지. 객체 별로 다른 상태를 가짐.
}
}
- dog1에는 힙 영역에 존재하는 메모리의 주소값이 들어감.
- dog2에도 힙 영역에 존재하는 새로운 메모리의 주소값이 들어감.
변수의 선언 위치에 따른 분류
| 종류 | 변수종류 | 선언위치 |
|---|---|---|
| 멤버변수 | 클래스 멤버변수 | 클래스 영역 |
| 인스턴스 멤버 변수 | 클래스 영역 | |
| 지역변수 | 지역변수 | 함수 내부 |
| 파라미터 변수 | 함수 선언부 |
public class Vari {
static int no; // 클래스 멤버 변수
int age; // 인스턴스 멤버 변수
void hi(String message) { // 파라미터 변수
System.out.println(message);
}
public static void main(String[] args) {
int x = 3; // 로컬 변수
if (x > 1) {
String s = "정답"; // 로컬 변수
System.out.println(s);
}
}
}
인스턴스 멤버 변수
- 클래스 영역에 선언.
- 객체가 생성 될때 메모리에 생성됨. (heap영역에 생성)
- 타입 별로 default 값으로 초기화 됨.
- Garbage Collector에 의해 객체가 소멸될 때 같이 소멸.
- 객체이름.변수명 으로 접근 ex) vair1.age
클래스 멤버 변수(공유 변수)
- 클래스 영역에 선언.
- 앞에 static 키워드 붙임.
- 클래스 영역에 클래스가 로딩될 때 메모리에 생성.
- 객체 각각의 생성과는 무관.
- 모든 객체가 공유.
- 타입 별로 default 값으로 초기화 됨.
- 프로그램 종료 시 소멸.
- 클래스이름.변수명 으로 접근 ex) Vari.no
지역 변수 & 파라미터 변수
- 클래스 영역의 {} 이외의 모든 중괄호 안에 선언. ex) 메소드, 생성자, 초기화 블록
- 선언된 라인이 실행될 때 생성됨. (thread 별로 생성된 stack 영역)
- 사용하기 전 명시적 초기화가 필요.
- 선언된 내부에서 변수 이름으로 접근 가능.(외부에서는 접근 불가)
- 선언된 영역을 벗어나면 소멸.
메소드
- 현실의 객체가 하는 동작을 프로그래밍 화 시킨 것.
- 명령문의 집합.
메소드의 장점
- 코드의 중복 방지, 유지 보수 용이
메소드의 접근
- 멤버 변수와 마찬가지로 static, non-static을 구분해서 호출.
- 메모리에 있으면 호출 가능, 메모리에 없으면 호출 불가.
- static member -> 클래스 로딩 시 자동 등록되기 때문에 언제나 메모리에 있음.
- instance member -> 객체 생성 전에는 메모리에 없음.
- 객체 생성 후 , 그 객체를 통해서 접근해야 함.
메소드 오버로딩(overloading)
- 동일한 기능을 수행하는 같은 이름의 메소드를 추가.
- 파라미터의 타입이나 순서, 개수가 달라야 함.(리턴 타입은 의미 없음)
- 중복 코드 제거할 수 있음.
// 파라미터의 타입과 개수가 같으므로 중복 선언 오류. (overloading 아님)
int mul(int a, int b) {return a * b;}
int mul(int x, int y) {return x * y;}
// 리턴 타입이 달라도 파라미터의 타입과 개수가 같으므로 중복 선언 오류. (overloading 아님)
int mul(int x, int y) {return x * y;}
long mul(int x, int y) {return x * y;}
// 파라미터 타입의 순서가 다르므로 overloading
long mul(int a, long b) {return a * b;}
long mul(long a, int b) {return a * b;}
생성자(Constructor)
- 객체 생성 시 자동으로 호출되는 메소드의 일종.
- new 키워드와 동시에 호출됨.
- 멤버 변수의 초기화나 객체 생성 시 실행되어야 하는 로직 실행.
- 리턴 타입이 없고 이름은 클래스 이름으로 작성.
public class Dog {
String species;
int age;
String name;
public Dog() {} //기본 생성자. 이 코드가 없으면 컴파일러가 자동으로 생성.
public Dog(String species, int age) { // 파라미터가 있는 생성자. 파라미터가 있는 생성자를 만들면 기본 생성자는 자동으로 생성되지 않음.
this.species = species; //this 키워드
this.age = age;
}
public Dog(String species, int age, String name) {
this(species, age); //this() 사용
this.name = name;
}
void eat() {
System.out.println("밥먹는다 멍멍");
}
void shout() {
System.out.println("짖는다 왈왈!");
}
}
this.
- 객체 자신을 가리키는 키워드.
- this.변수명 을 이용해 자신의 멤버에 접근 가능.
- 객체에 대한 참조이기 때문에 static 영역에서는 사용 불가.
this()
- 생성자도 오버로딩 가능.
- 객체 내의 한 생성자에서 다른 생성자를 호출할 때 사용.
- 객체 자신의 생성자를 호출.(파라미터에 맞는 생성자 호출)
Author And Source
이 문제에 관하여(JAVA 문법#2), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@wornjs135/JAVA-문법2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)