2020. 11. 5. 16:34ㆍ자바(Java)
자바(Java) 클래스(Class), 인스턴스(Instance), 객체(Object)에 대한 정리
▶ 객체지향프로그램이 나타나게 된 이유
- 프로그램의 중요한 원칙 중 하나
중복의 제거 : 재활용성↑, 유지보수의 편의성↑, 가독성↑ -> method 사용
기존에 코드와 동일하게 동작하지만 더 효율적인 코드로 만드는것을 refactoring이라고 한다.
- 로직이 커지고 코드의 양이 많아질수록 문제점이 발생하기 시작한다.
여러개의 다른 목적을 가지고있는 코드들이 섞이게된다.
-> 변수 이름을 좀 더 명확하게 한다던지, 같은 유형의 코드들을 한 곳에 모아두던지 등..
-> 언어를 만드는사람은 이러한 문제를 해결하기위한 방법으로 객체지향프로그래밍을 제시했다.
▶ 객체화
package ob;
class Calculator{
int left, right;
public void setOprands(int left, int right){
this.left = left;
this.right = right;
}
public void sum(){
System.out.println(this.left+this.right);
}
public void avg(){
System.out.println((this.left+this.right)/2);
}
}
public class CalculatorDemo4 {
public static void main(String[] args) {
Calculator c1 = new Calculator();
c1.setOprands(10, 20);
c1.sum();
c1.avg();
Calculator c2 = new Calculator();
c2.setOprands(20, 40);
c2.sum();
c2.avg();
}
}
- Calculator는 클래스이다.
- 클래스는 인스턴스(실체)의 설계도에 해당된다.,
- Calculator c1 = new Calculator(); 에서 Calculator()는 객체이다.
new를 통해서 c1에 담겨져있는 구체적인 객체라할 수 있는 인스턴스를 만든다.
- 객체가 메모리에 할당되어 실제 사용될 때 인스턴스라고 부른다.
- 객체를 소프트웨어에서 실체화하면 그것을 인스턴스라고 부른다.
- 객체는 모든 인스턴스를 대표하는 포괄적인 의미다.(인스턴스는 객체에 포함된다고 볼수있다.)
- 객체를 하나의 독립된 프로그램으로 생각하면 된다.
- 객체는 변수와 메소드의 집합이다.
- 객체, 클래스를 만든다는것은 사용자정의 데이터타입을 만드는 것이다.
코드를 더 효율적이고 경제적으로 작성할 수 있는 수단을 제공한다.
▶ 클래스 멤버와 인스턴스 멤버
package member;
class Calculator {
static double PI = 3.14;
int left, right;
public void setOprands(int left, int right) {
this.left = left;
this.right = right;
}
public void sum() {
System.out.println(this.left + this.right);
}
public void avg() {
System.out.println((this.left + this.right) / 2);
}
}
public class CalculatorDemo1 {
public static void main(String[] args) {
Calculator c1 = new Calculator();
System.out.println(c1.PI);
Calculator c2 = new Calculator();
System.out.println(c2.PI);
System.out.println(Calculator.PI);
}
}
- 우리는 위의 코드에서 c1,c2에 두개의 인스턴스를 만들었다.
left와 right는 인스턴스의 변수로서 인스턴스마다 서로 다른 변수를 가지고 있다.
- 클래스의 소유인 변수와 인스턴스의 소유인 변수는 다르다.
클래스의 멤버변수는 모든 인스턴스에서 똑같은 값을 갖는다.
인스턴스를 생성하지 않고도 클래스에접근해서 변수를 사용할 수 있다.
- sum()과 avg()는 우리가 만든 객체에따라 다른 결과를 가지게된다.
-> 객체마다 다른 변수값을 가짐.
- static이 붙어있으면 정적 변수 : 변수가 클래스에 소속이된다
-> 이 변수가 모든 인스턴스에서동일한 값을 가지게 된다는 것
static이 붙어있으면 클래스의 멤버 / static이 붙어있지않으면 인스턴스의 멤버
- 위에 코드에서 PI는 인스턴스로 접근할 수 있지만 Calculator.PI처럼 클래스로 접근할 수도 있다.
- 클래스의 변수(static 변수타입 변수이름)의 용도
1. 인스턴스에 따라 변하지 않는 값이 필요한 경우
2. 인스턴스를 생성할 필요가 없는 값을 클래스에 저장하고 싶을 경우
3. 값의 변경 사항을 모든 인스턴스가 공유해야 하는 경우
▶ 클래스 메소드와 인스턴스 메소드
package method;
class Calculator3{
public static void sum(int left, int right){
System.out.println(left+right);
}
public static void avg(int left, int right){
System.out.println((left+right)/2);
}
}
public class CalculatorDemo3 {
public static void main(String[] args) {
Calculator3.sum(10, 20);
Calculator3.avg(10, 20);
Calculator3.sum(20, 40);
Calculator3.avg(20, 40);
}
}
- 위의 코드를 보면 인스턴스를 사용하지않고 클래스로 접근을 하고 있다.
- 메소드앞에 static을 붙이게되면 클래스 메소드가된다.(클래스 소속의 메소드가된다.)
즉, 클래스에 직접 접근해서 실행할 수 있다.
그냥 일회용처럼 인자만 넣어 사용해도되는경우에는 굳이 인스턴스를 만들어서 코드를 길게
만들어 사용할 필요가 없기때문에 이런식으로 사용한다.(메모리 절약, 빠른 동작)
- 1. 인스턴스 메소드는 클래스 멤버에 접근 할 수 있다.
2. 클래스 메소드는 인스턴스 멤버에 접근 할 수 없다.
-> 클래스는 항상 메소드보다 먼저 존재함. 인스턴스는 클래스를 기반으로 나중에 만들어진다.
즉, 클래스 메소드는 인스턴스에 접근하려고하면 아직 생성되지 않은 인스턴스에 접근하려고
하는 것이기때문에 불가능하다. 하지만 인스턴스 메소드의 경우에는 클래스가 이미 존재하기
때문에 클래스 변수와 메소드에 접근할 수 있다.
package lecture1;
public class Occation {
static int static_variable = 1;
int instance_variable = 2;
static void static_static() { // 클래스 메소드에서 클래스 변수에 접근
System.out.println(static_variable);
}
static void static_instance() { // 클래스 메소드에서 인스턴스 변수에 접근
System.out.println(instance_variable);
}
static void instance_static() { // 인스턴스 메소드에서 클래스 변수에 접근
System.out.println(static_variable);
}
static void instance_instance() { // 인스턴스 메소드에서 인스턴스 변수에 접근
System.out.println(instance_variable);
}
}
public class ClassMemberDemo {
public static void main(String[] args) {
C1 c = new C1();
c.static_static();
// 인스턴스를 이용해서 정적 메소드에 접근 => 성공
// 클래스 메소드가 클래스 변수에 접근 => 성공
c.static_instance();
// 인스턴스를 이용해서 정적 메소드에 접근 => 성공
// 클래스 메소드가 인스턴스 변수에 접근 => 실패
c.instance_static();
// 인스턴스를 이용해서 정적 메소드에 접근 => 성공
// 인스턴스 메소드가 클래스 변수에 접근 => 성공
c.instance_instance();
// 인스턴스를 이용해서 정적 메소드에 접근 => 성공
// 인스턴스 메소드가 인스턴스 변수에 접근 => 성공
C1.static_static(); // 클래스를 통해서 직접 접근가능
// 클래스를 이용해서 정적 메소드에 접근 => 성공
// 클래스 메소드가 클래스 변수에 접근 => 성공
C1.static_instance(); // 클래스 통해서 직접 접근가능
// 클래스를 이용해서 정적 메소드에 접근 => 성공
// 클래스 메소드가 인스턴스 변수에 접근 => 실패
C1.instance_static();
// 클래스를 이용해서 인스턴스 메소드에 접근 => 실패
C1.instance_instance();
// 클래스를 이용해서 인스턴스 메소드에 접근 => 실패
}
}
- 인스턴스 변수 = Non-Static Field
- 클래스 변수 = Static Field
ref)이 내용은 유튜브 생활코딩님의 강의영상을 참고하였습니다.
'자바(Java)' 카테고리의 다른 글
자바(Java) 스택(Stack)과 큐(Queue) 정리 (0) | 2020.11.06 |
---|---|
자바(Java) 제네릭(Generic) 설명 (0) | 2020.11.02 |