본문 바로가기

춘기IT/춘기개발

객체 지향 프로그래밍과 Dart (2) - 클래스와 메서드

Today I Learned (250707) 4-1.

 

클래스 구성

- 클래스는 속성과 메서드로 구성되어 있음 + 생성자

- 속성과 메서드는 클래스 안에 있는 요소로 클래스의 멤버라고 부르기도 함

 

메서드(Method)

- 객체의 동작을 정의하는 함수

- 속성을 변경하거나 객체를 가지고 특정 작업을 수행함

 

Q. 함수와 메서드의 차이

- 함수와 메서드는 모두 동작을 정의한다는 점에서는 같지만

메서드는 클래스에 의존하고, 함수는 클래스에 의존하지 않는다는 차이가 있음

void function() {
  print('저는 함수입니다 !');
}

class Class {
	void method() {
		print('저는 메서드입니다 !');
	}
}

void main() {
  function(); // 저는 함수입니다 !
  
  Class object = Class();
  object.method(); // 저는 메서드입니다 !
}

/* method는 클래스 안에 있어서 클래스 의존적이지만,
function()은 클래스 안에 있지 않아 클래스와 독립된 친구임

메서드의 종류

1. 인스턴스 메서드(Instance Method)

- 객체에 속해 있는 메서드

class Person {
  String name = '화춘기';
	int age = 25;

  void introduce() {
    print('안녕 ? 나는 $age살 $name !');
  }
}

//introduce()가 인스턴스 메서드

 

- 인스턴스 메서드는 this를 통해 접근할 수 있음

class Person {
  String name = '화춘기';
  int age = 25;
  
  void printName() {
    print(name);
  }
  
  void printNameAndAge() {
    this.printName();
    print(age);
  }
}

// this 없이 printName();도 가능

 

- 인스턴스 메서드는 클래스의 모든 곳에서 접근할 수 있음

class Person {
  String name = '화춘기';
  int age = 25;
  
  void printName() {
    print(name);
  }
  
  void printNameAgain() {
    printName();
  }
}

 

2. 정적 메서드(Static Method) - 클래스 메서드라고도 부름

- 객체에 종속되지 않고 클래스 자체에 속하는 메서드

class Circle {
	static double pi = 3.14159;
	
  static void printPi() {
	  print('원주율은 $pi !');
  }
}

//printPi() 맨 앞에 붙은 static < static이 붙은 것은 정적 클래스

 

- 정적 메서드는 클래스 이름을 통해 호출함 - 그래서 객체를 생성하지 않고 메서드를 호출할 수 있음

class Circle {
	static double pi = 3.14159;
	double radius = 0;
	
  static void printPi() {
	  print(pi);
  }
  
  void printRadius() {
    print(radius);
  }
}

void main() {
	Circle.printPi(); // 3.14159
	Circle.printRadius(); // 오류 발생
}

/* printRadius() 는 인스턴스 메서드로 클래스 이름으로 접근할 수 없지만,
printPi() 는 정적 메서드이기 때문에 클래스 이름으로 접근할 수 있음
정적 메서드는 클래스 꺼

 

- 정적 메서드는 객체를 통해 호출할 수 없음

class Circle {
	static double pi = 3.14159;
	double radius = 0;
	
  static void printPi() {
	  print(pi);
  }
  
  void printRadius() {
    print(radius);
  }
}

void main() {
	Circle circle = Circle();
	circle.radius = 5;
	circle.printRadius(); // 5
	circle.printPi(); // 오류 발생
}

/* printPi()는 정적 메서드여서 객체로 접근할 수 없지만,
printRadius()는 인스턴스 메서드여서 객체로 접근 가능
정적 메서드는 객체에 종속되지 않아 객체로 접근할수 없음

 

- 정적 메서드는 this를 통해 호출할 수 없음

class Circle {
	static double pi = 3.14159;
	double radius = 0;
	
  static void printPi() {
	  print(pi);
  }
  
  void printPiAgain() {
	  this.printPi(); // 오류 발생
  }
}

/* this는 객체를 가리키는 키워드,
정적 메서드는 객체에 종속되지 않아 this 못씀

 

- 정적 메서드는 코드 블록에서 인스턴스 변수를 사용할 수 없음

class Circle {
	double pi = 3.14159;
	double radius = 0;
	
  static void printPi() {
	  print(pi); // 오류 발생
  }
}

 

Q. 인스턴스 메서드의 코드 블록에서 정적 변수는 사용할 수 있음

class Circle {
	static double pi = 3.14159;
	double radius = 0;
  
  void printArea() {
    print(pi * radius * radius);
  }
}

// 정적 변수인 pi 를 인스턴스 메서드에 사용

 

- 정적 메서드는 객체마다 개별적으로 동작하지 않고, 모두 동일하게 동작함


하나의 클래스로 여러 객체를 생성할 수 있기 때문에

공통된 속성과 동작을 갖는 코드를 여러 번 작성하지 않아도 돼서 재사용성 높은 코드를 만들 수 있음