[자바]객체지향언어란, 클래스란, 멤버변수vs지역변수

[자바]객체지향언어란, 클래스란, 멤버변수vs지역변수

  1. 클래스 class : 실생활에서 도면에 해당하는 것, 객체를 만드는 원판
  2. 객체 object=instance : 도면을 이용해서 찍어내는 제품, 원판을 통해 만들어진 객체
  3. 인스턴스화 : 클래스 - 인스턴스화(=객체화=객체생성=메모리에 객체가 생성됨)-> 객체

https://m.blog.naver.com/PostView.nhn?blogId=satyee&logNo=140128005527&proxyReferer=https:%2F%2Fwww.google.com%2F




객체지향언어

객체는 예약어로 따지자면 class다.
객체를 프로그램에 포함하기위해서는 내가 필요한 기능만 뽑는 즉, 추상화과정이 필요하다.

  • 객체지향언어의 특징 : 모듈화
    • 객체지향의 큰 특징 중 하나는 모듈화이다.
    • 모듈은 재사용이 가능하다록 조립된 블록이고 모듈화란 모듈 형식으로 작업을 진행하는 것을 말한다.
    • 추가/수정/삭제가 쉽다.
    • 재사용이 가능하다.
    • 이미 검증된 모듈을 사용할 경우 신뢰도가 높다.




객체지향언어 vs 절차지향언어(기능위주언어)

두 언어 모두 function이 있지만 객체지향언어는 객체단위로이루어져있다

  1. 객체지향언어
    논리적 흐름에 따라 위에서 쭉 코드를 작성해나가는 탑다운 방식을 사용한다.
    즉,자바는 객체지향 프로그래밍언어로 함수보다는 클래스객체를 만들어 문제를 해결해나간다
    예를들어 사칙연산프로그램을 만든다면 +클래스, *클래스, *클래스, /클래스를 만든다.

  2. 절차지향언어
    위에서 쭉 코드를 작성해나가는 것보다 기능중심의 함수를 정의해 문제를 해결해나간다.
    절차지향언어 예로는 파이썬이 있는데 워낙 인기가 많고 쉽게 사용하다보니 java도 버전9부터 람다를 만들어서 기능/함수위주의 언어로 가기 위해 노력하고있다.




클래스(객체)

자바는 모든 코드가 클래스에 담겨 있는 100% 객체지향언어이다.
클래스란, 객체를 정의하는 틀이다.
클래스의 형태는 아래와 같다
클래스안의 변수들은 멤버변수라고 부른다.

http://tcpschool.com/java/java_class_declaration

1
2
3
4
5
class 클래스명{ 
int 멤버변수;
String 멤버변수;
실행코드;
}

하나의 클래스를 생성해놓았다면 꼭 객체생성을 해야쓸 수 있다.
왜냐하면 객체생성을 해주지않으면 메모리에 올라가지않는다.




접근지정자 class 클래스명{ 실행코드 }

접근지정자는 접근허용한도를 정해주는 키워드이다.

  • public : 누구나 접근 가능하다
  • protected : 같은 패키지 내에 있거나 상속받은 자손클래스에서만 졉근가능
  • default(package-private) : 아무런 접근 제어자를 적어주지 않을 때이며, package-private라고도 불린다. 같은 패키지 내에 있을 때만 접근 가능하다.
  • private : 해당 클래스 내에서만 접근 가능하다.
1
2
3
접근지정자 class 클래스명{ 
실행코드
}
  • 접근지정자 범위
    • public > protected > 기본접근지정자(디폴트) > private
    • public이 가장 넓은 범위이다.
    • 매서드오버라이딩시 접근지정자는 슈퍼클래스의 메서드보다 범위가 줄어들어서는 안된다. 커지는 건 가능.




클래스(객체) 구성요소

하나의 클래스는 필드(Field), 생성자(Constructor), 메소드(Method)로 구성된다.

  1. 필드 => 객체의 속성
    • 필드는 멤버변수(=필드변수, 인스턴스 변수)라고 하며 class내부에 선언되는 변수이다.
    • 변수는 선언의 위치에 따라 멤버변수와 지역변수로 나누어진다.
    • 멤버변수는 클래스변수와 인스턴스 변수로 나누어진다.
  2. 생성자 => 멤버변수를 초기화
  3. 메서드 => 객체의 기능




변수

변수는 변수의 타입에 따라 기본형과 참조형으로 구분할수있고 또한 변수의 선언 위치에 따라 변수의 종류를 구분할 수도 있다.

선언위치 변수명 변수종류 특징
클래스내부선언 멤버변수 클래스멤버변수 static키워드사용(객체생성필요X, 객체가 메모리에 자동생성)
클래스내부선언 멤버변수 인스턴스멤버변수 static키워드없음(객체생성필요O)
메소드나 생상자에서 생성 지역변수(=로컬변수) 로컬변수
메소드나 생상자에서 생성 지역변수(=로컬변수) 파라미터 변수 메서드 파라미터

참고로 파라미터변수는 지역변수소속이므로 지역변수이다.




멤버변수 VS 지역변수

자바는 선언위치에 따라 크게 두 종류의 변수로 나눠진다.

  1. 멤버변수 : 클래스변수, 지역변수
    • class내부에 선언되는 변수
    • 자동으로 초기화됨(주로 0)
  2. 지역변수 : 로컬변수, 파라미터변수
    • 메소드나 생성자, 초기화블록처럼 class영역 내에 있는 또 다른 블록 내부에 선언된 변수
    • 메서드가 종료되면 자동소멸된다.
    • 자동으로 초기화안됨. -> 명시적인 초기화가 필요하다.




클래스멤버변수 vs 인스턴스멤버변수

이제 멤버변수안에 있는 두가지 변수를 비교해보자
클래스멤버변수 = static 멤버변수.
static변수은 정적이라는 의미이다. static변수는 객체생성필요없이 사용가능하다.

그럼 객체생성할 필요없는 static멤버변수를 쓰면 편한데 왜 굳이 객체생성까지해야하는 인스턴스멤버변수를 사용할까?
자바에서는 static키워드를 사용한다는 것은 메모리에 한번 할당되어 프로그램이 종료될 때 해제되는 것을 의미한다.
메모리를 많이 잡아먹기때문에 필요한 것들만 사용하는 인스턴스멤버변수를 사용하는 것이 메모리 효율에 좋다.

참고링크 : static변수와 static메소드

static이 붙고 안붙고의 차이를 아래 예시의 출력값으로 비교해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Person {
String name; //인스턴스멤버변수
int age; //인스턴스멤버변수
static int a; //클래스멤버변수
}

public static void main(String[] args) {
Person.a =0;

Person p1 = new Person(); //객체생성 ->객체생성을 하지않으면 메모리에 올가가지않기에 객체생성을 꼭해야한다.
p1.name = "홍길동";
p1.a = 100;

Person p2 = new Person(); //객체생성
p2.name = "이순신";
p2.a = 200;

System.out.println(p1.name + " : "+p1.a); //홍길동 : 200
System.out.println(p2.name + " : "+p2.a); //이순신 : 200
}

출력값의 차이를 보자
인스턴스멤버변수인 name의 경우 홍길동, 이순신 각각 잘 출력되었지만
클래스멤버변수인 a의 경우 p1.a =100;이라고 선언해도 탑다운방식으로 출력문전에 200으로 바뀌었으므로 둘다 200으로 출력된다.




전역변수

변수를 공부하다가 생각난 변수가 있는데 바로 전역변수이다.
자바에는 전역변수가 없나생각했는데 nope!!
자바에서는 클래스를 기준으로 사용하므로 클래스안에 있는 멤버변수가 전역변수이다!
클래스
즉 멤버변수 = 전역변수 = 필드변수라고도한다