[자바]객체지향언어란, 클래스란, 멤버변수vs지역변수
- 클래스 class : 실생활에서 도면에 해당하는 것, 객체를 만드는 원판
- 객체 object=instance : 도면을 이용해서 찍어내는 제품, 원판을 통해 만들어진 객체
- 인스턴스화 : 클래스 - 인스턴스화(=객체화=객체생성=메모리에 객체가 생성됨)-> 객체
객체지향언어
객체는 예약어로 따지자면 class다.
객체를 프로그램에 포함하기위해서는 내가 필요한 기능만 뽑는 즉, 추상화과정이 필요하다.
- 객체지향언어의 특징 : 모듈화
- 객체지향의 큰 특징 중 하나는 모듈화이다.
- 모듈은 재사용이 가능하다록 조립된 블록이고 모듈화란 모듈 형식으로 작업을 진행하는 것을 말한다.
- 추가/수정/삭제가 쉽다.
- 재사용이 가능하다.
- 이미 검증된 모듈을 사용할 경우 신뢰도가 높다.
객체지향언어 vs 절차지향언어(기능위주언어)
두 언어 모두 function이 있지만 객체지향언어는 객체단위로이루어져있다
객체지향언어
논리적 흐름에 따라 위에서 쭉 코드를 작성해나가는 탑다운 방식을 사용한다.
즉,자바는 객체지향 프로그래밍언어로 함수보다는 클래스객체를 만들어 문제를 해결해나간다
예를들어 사칙연산프로그램을 만든다면+클래스, *클래스, *클래스, /클래스
를 만든다.절차지향언어
위에서 쭉 코드를 작성해나가는 것보다 기능중심의함수
를 정의해 문제를 해결해나간다.
절차지향언어 예로는 파이썬이 있는데 워낙 인기가 많고 쉽게 사용하다보니 java도 버전9부터 람다를 만들어서 기능/함수위주의 언어로 가기 위해 노력하고있다.
클래스(객체)
자바는 모든 코드가 클래스에 담겨 있는 100% 객체지향언어이다.
클래스란, 객체를 정의하는 틀이다.
클래스의 형태는 아래와 같다
클래스안의 변수들은 멤버변수라고 부른다.
1 | class 클래스명{ |
하나의 클래스를 생성해놓았다면 꼭 객체생성
을 해야쓸 수 있다.
왜냐하면 객체생성을 해주지않으면 메모리에 올라가지않는다.
접근지정자 class 클래스명{ 실행코드 }
접근지정자는 접근허용한도를 정해주는 키워드이다.
- public : 누구나 접근 가능하다
- protected : 같은 패키지 내에 있거나 상속받은 자손클래스에서만 졉근가능
- default(package-private) : 아무런 접근 제어자를 적어주지 않을 때이며, package-private라고도 불린다. 같은 패키지 내에 있을 때만 접근 가능하다.
- private : 해당 클래스 내에서만 접근 가능하다.
1 | 접근지정자 class 클래스명{ |
- 접근지정자 범위
- public > protected > 기본접근지정자(디폴트) > private
- public이 가장 넓은 범위이다.
- 매서드오버라이딩시 접근지정자는 슈퍼클래스의 메서드보다 범위가 줄어들어서는 안된다. 커지는 건 가능.
클래스(객체) 구성요소
하나의 클래스는 필드(Field), 생성자(Constructor), 메소드(Method)로 구성된다.
- 필드 => 객체의 속성
- 필드는 멤버변수(=필드변수, 인스턴스 변수)라고 하며 class내부에 선언되는 변수이다.
- 변수는 선언의 위치에 따라 멤버변수와 지역변수로 나누어진다.
- 멤버변수는 클래스변수와 인스턴스 변수로 나누어진다.
- 생성자 => 멤버변수를 초기화
- 메서드 => 객체의 기능
변수
변수는 변수의 타입에 따라 기본형과 참조형으로 구분할수있고 또한 변수의 선언 위치에 따라 변수의 종류를 구분할 수도 있다.
선언위치 | 변수명 | 변수종류 | 특징 |
---|---|---|---|
클래스내부선언 | 멤버변수 | 클래스멤버변수 | static키워드사용(객체생성필요X, 객체가 메모리에 자동생성) |
클래스내부선언 | 멤버변수 | 인스턴스멤버변수 | static키워드없음(객체생성필요O) |
메소드나 생상자에서 생성 | 지역변수(=로컬변수) | 로컬변수 | |
메소드나 생상자에서 생성 | 지역변수(=로컬변수) | 파라미터 변수 | 메서드 파라미터 |
참고로 파라미터변수는 지역변수소속이므로 지역변수이다.
멤버변수 VS 지역변수
자바는 선언위치에 따라 크게 두 종류의 변수로 나눠진다.
- 멤버변수 : 클래스변수, 지역변수
- class내부에 선언되는 변수
- 자동으로 초기화됨(주로 0)
- 지역변수 : 로컬변수, 파라미터변수
- 메소드나 생성자, 초기화블록처럼 class영역 내에 있는 또 다른 블록 내부에 선언된 변수
- 메서드가 종료되면 자동소멸된다.
- 자동으로 초기화안됨. -> 명시적인 초기화가 필요하다.
클래스멤버변수 vs 인스턴스멤버변수
이제 멤버변수안에 있는 두가지 변수를 비교해보자
클래스멤버변수 = static 멤버변수.
static변수은 정적이라는 의미이다. static변수는 객체생성필요없이 사용가능하다.
그럼 객체생성할 필요없는 static멤버변수를 쓰면 편한데 왜 굳이 객체생성까지해야하는 인스턴스멤버변수를 사용할까?
자바에서는 static키워드를 사용한다는 것은 메모리에 한번 할당되어 프로그램이 종료될 때 해제되는 것을 의미한다.
메모리를 많이 잡아먹기때문에 필요한 것들만 사용하는 인스턴스멤버변수를 사용하는 것이 메모리 효율에 좋다.
static이 붙고 안붙고의 차이를 아래 예시의 출력값으로 비교해보자.
1 | public class Person { |
출력값의 차이를 보자
인스턴스멤버변수인 name의 경우 홍길동, 이순신 각각 잘 출력되었지만
클래스멤버변수인 a의 경우 p1.a =100;이라고 선언해도 탑다운방식으로 출력문전에 200으로 바뀌었으므로 둘다 200으로 출력된다.
전역변수
변수를 공부하다가 생각난 변수가 있는데 바로 전역변수이다.
자바에는 전역변수가 없나생각했는데 nope!!
자바에서는 클래스를 기준으로 사용하므로 클래스안에 있는 멤버변수가 전역변수이다!
클래스
즉 멤버변수 = 전역변수 = 필드변수라고도한다