Java-UML, 생성자, static
UML
- Unified Modeling Language (통합 모델링 언어)
- 객체지향 소프트웨어에서 집약시스템을 개발할 때 산출물을 명세화, 시각화, 문서화 할 때 사용
-
그 중 하나의 종류인 클래스 다이어그램이 있다.
- 클래스 다이어그램
- 클래스 내부의 정적인 내용이나 클래스 사이의 관계를 표현하는 다이어그램(그림)으로 시스템의 일부 또는 전체 구조를 나타냄.
- 구성요소 : 클래스이름, 속성(필드), 기능(메소드) - (속성, 기능은 생략 가능)
- 클래스이름, 필드, 메소드 순으로 사각형이 이루어져있고 앞에 부호는 -는 private, +는 public 이다.
생성자
Car myCar = new Car();
- 위의 new가 객체 생성연산자
- Car(); → 이게 생성자
-
생성자란? → 객체가 생성될 때에 필드에 초기값을 제공하고 필요한 초기화 절차를 하는 메소드
- 생성자 구조
public Car () { }
-
접근제한자 클래스명 (매개변수) { 초기설정코드; }
- 디폴트 생성자
- 생성자 형식에 맞게 객체를 생성해야한다. 디폴트 생성자가 없는데 그냥 Car myCar = new Car(); 호출하면 에러뜸.
- 클래스 작성 시 생성자를 하나도 만들지 않았을 경우 자동으로 비어져있는 디폴트 생성자 제공.
- 하지만 생성자가 하나라도 정의되어있다면 디폴트 생성자는 만들어지지않음.
- 생성자 오버로딩
- 외부에서 제공되는 다양한 데이터를 이용해서 객체를 초기화하기 위해서는 생성자도 댜양화될 필요가 있다.
- 자바는 다양한 방법으로 객체를 생성할 수 있도록 생성자 오버로딩을 제공.
- 생성자 오버로딩이란 매개변수를 달리하는 생성자를 여러 개 선언하는 것.
- 생성자에서 this(); 사용하기
public Car(String color) { this(color, 80,100); } public Car(String color, int speed) { this(color, speed ,10000); } public Car(String color, int speed, int mileage) { super(); this.color = color; this.speed = speed; this.mileage = mileage;
- this();는 자신의 다른 생성자를 호출하는 코드, 무조건 블록내부 첫 줄에서만 쓸 수 있음.
- 필드, 메소드 → 클래스를 구성하는 구성요소로 클래스를 통해 객체를 생성하면 각 객체마다 필드와 메소드가 생성
Static
- 정적 필드
- 모든 객체를 통틀어 하나만 있는 변수
- 그냥 필드와 다르게 객체를 생성 안해도, 아무리 생성을 많이 해도 한 개만 존재하는 변수
- 용도
- 모든 객체가 하나의 데이터를 공유하기 위해서 (ex: numberOfCars 변수로 차 객체 생성할 때마다 넘버링하기)
- 모든 객체에서 공통적으로 사용할 상수를 설정하기 위해서
- 얘는 완전 클래스 자체의 절대 바뀌지 않는 필드네→ 접근할 때도 객체참조변수.정적필드가 아니라 객체의 클래스.정적필드 이렇게 쓰는게 맞는거. mycar.INCREASE가 아니라 Car.INCREASE 임. 객체가 없을 때에도 존재하며 접근할 수 있기때문이다.
비교하기
- 지역변수 → 메소드 내에서 생성, 메소드가 종료될 때 사라짐.
- 필드 → 클래스 내부에서 정의, 해당 클래스가 객체화될 때마다 각 객체에 생성, 해당 객체가 소멸할 때 사라짐.
-
정적필드 → 클래스 내부에 static 키워드를 포함해서 정의, 프로그램이 실행될 때 생성, 프로그램이 종료될 때 사라짐. 다른 말로 클래스변수라고 불린다.
- 정적 메소드
- 정적필드에 private 주면 클래스 밖에서 접근이 안됨 → getter메소드 필요함 → 그래서 정적 메소드 이용
아래 코드 실수 꼭 꼭 명심하고 다신 실수하지 말자
- 잘못된 문자열 비교 (name에는 문자열이 저장되어있는 주소값이 저장되어진 참조변수이다.)
if (name == "hong")) { return true; } else { return false; }
- 옳은 문자열 비교 (equals 메소드를 통해 name의 주소값이 아닌 실제 문자열값을 가져와서 비교한다.)
if (name.equals("hong")) { return true; } else { return false; }
댓글남기기