역슬래시: \나 \는 같은 기호로, 폰트에 따라 다르게 나온다. \가 입력되어도 역슬래시, \가 입력되어도 역슬래시이다.
return 키워드: return이 속해있는 메서드를 종료하는 키워드이다.
validation check: 유효성 확인. 입력받은 값이 적절한지 판단한다. 유효하지 않을 경우 return키워드를 써서 종료한다.
identifier를 생성할 때의 규칙)
camel case) camel case란 대소문자를 함께 사용해 가독성 좋게 identifier를 만드는 것을 말한다. AbcDefG처럼 낙타 등과 같이 생겨서 camel case이다. 자바는 대소문자를 구분하는 언어이기에 camel case를 사용한다.
클래스 identifier를 만들 때에는 대문자로 시작하고, 새 단어가 시작하는 글자를 다시 대문자로 표현한다.
ex)public class ClassName
value identifier를 만들 때에는 소문자로 시작하고, 새 단어가 시작하는 글자를 대문자로 표현한다. ex)int studentName;
snake case) 대소문자를 구분하지 못하는 언어에서는 언더바_를 이용해 하나의 identifier안에 있는 단어와 단어를 구분한다.
java_home
==================================
call by value : 값 자체를 전달하는 것.
int a = 10;
int b = a;
b = 20;
==> a가 10을 갖고 있고, b도 10을 갖고 있다. 근데 b에다 20을 대입하라 했으니 a=10이고 b=20이다.
call by reference : 주소 값을 전달하는 것.
int[] intArrayOriginal = {1, 2, 3, 4};
int[] intArrayCopy = intArrayOriginal;
intArrayCopy[1] = 5;
System.out.println(intArrayOriginal[1]); //==>5가 나온다.
==> 배열 {1, 2, 3, 4}의 주소값을 intArrayOriginal이 가지고 있다. 그리고 그 주소값을 intArrayCopy가 가져왔다.
intArrayCopy의 1번 요소, 그니까 주소값에 있는 배열의 2를 5로 바꿨다.
그러면 intArrayOriginal도 같은 주소값을 참조하고 있으므로 함께 변한다.
=================================
배열은 생성 시 값을 설정해주지 않아도 초기화되어있다.
숫자 데이터 타입의 어레이는 0으로(정수는 0, 실수는 0.0), boolean 데이터 타입의 어레이는 false로 초기화된다.
배열의 배열(다차원 배열)
자바에서는 N차원 배열이라는 말은 잘 사용하지 않는다.
int[][]test = new int[2][3];
==>test라는 이름의 인트어레이 변수를 만든다.
2칸짜리 인트저장공간을 만든다. 그리고 그 각각의 2칸에 3칸짜리 인트저장공간을 만든다.
test는 2칸짜리 인트저장공간의 주소값을 가지고 있는다.
test.length는 2, test[0].length는 3이다.
이렇게 배열의 저장공간이 정해져 있는 경우를 고정적 길이 배열이라 한다.
가변적 길이 배열도 있다.
int[][]test = new int [2][];
==>test라는 이름의 인트어레이 변수를 만들고, 2칸짜리 인트 저장공간을 만들고 하나 더 만들건데 그 크기는 비워둔다.
test[0] = new int[9];
test[1] = new int [3];
==> test의 0번 요소에는 9칸짜리 인트저장공간을, 1번요소에는 3칸짜리 인트저장공간을 만든 것이다.
========================================
객체지향이란 real world를 system화 하는 방법론 중 하나다.
오프라인에서 쇼핑을 하고, 은행에 가는 일들이 온라인으로 쇼핑몰이 생기고 인터넷 뱅킹이 가능해졌다.
이 때 오프라인에서 쇼핑 하던 행위를 쇼핑몰로 옮기는 작업을 한다.
이처럼 real world를 system화 해서 컴퓨터로 옮기는 방법 중 하나가 객체지향이다.
객체는 real world에서 system으로 옮길 때 표현되는 모든 것이다.
물리적인 객체는 real world에서 만져지는 것, 개념적인 객체는 계좌이체나 결제와 같은 만져지지 않는 것, 그리고 아직은 잘 모르지만 소프트웨어적 객체가 있다.
객체는 식별성을 갖는다. 이는 같은 상태를 갖더라도 구분할 수 있음을 보인다.
사람 A는 이름이라는 식별성, 가족에서 자녀/아들/딸/ 등의 식별성, 학원에서 수강생 이라는 식별성을 갖는다.
상태(status, attibute)는 객체가 가지고 있는 조건을 말한다. 일반적으로 행위나 시간에 따라 변화한다.
행위(behavior)는 객체가 할 수 있는 일들을 말한다.
예를 들어 물리적인 객체 보드마카를 보면 상태에는 이름, 색깔, 잉크량 등이 있을 것이고, 행위에는 쓰다 가 있다.
real world에서는 보드마카는 아무것도 하지 않고 사람이 쓰는 것 같지만, 들여다보면 사람은 보드마카를 움직이고, 실제로 잉크를 이용해 무언가를 표현하는 일은 보드마카가 하고 있다.
이 객체를 표현한 것을 class라고 한다.
class는 위와 같이 구체적으로 "보드마카"를 만들 수도 있지만, 효율적으로 작업하기 위해 공통된 특성(속성), 행위, 관계 등을 간추려 만든다.
class에는 두 종류가 있는데 Application class와 Bean class가 있다.
Application class는 Run(실행)하기 위한 클래스로, main이 포함되어 실행할 수 있는 클래스를 뜻한다.
Bean class는 real world를 표현하기 위한 클래스이다.
class를 만들 때 공통되는 핵심적인 특징으로 분류하는 과정을 추상화라고 한다.
추상화(Abstraction)은 객체지향의 기본 원리 중 하나로, 각 객체의 구체적인 특성을 제외한 공통점을 표현하는 과정이다.
예를 들어 고래, 코끼리, 독수리는 동물 이라는 공통점을 갖고 있다.
그리고 각 동물들은 고래, 코끼리, 독수리 라는 이름을 가지고 있고, 헤엄친다, 걸어간다, 날아간다 라는 행위를 가지고 있으며, 지느러미, 귀 크기, 날개 길이 등을 각각의 특성으로 갖는다.
이 때 이름과 행위는 각 동물의 공통적인 특성이기에 추상화할 수 있고, 지느러미, 귀 크기, 날개 길이는 구체적인 속성이기 때문에 추상화 과정에서 구현하지 않는다.
추상화는 문제영역에 의존적이다.
문제영역이라고 하는 것은 어떤 목적으로 class를 만드느냐 하는 것이다.
만약에 사람 A, B, C가 있으면 병원 관리 목록에서는 키, 몸무게, 주민등록번호 등의 상태(status, attibute)가 필요할 것이고, 교육기관에서는 전공, 나이, 학교 등이 필요할 것이다.
이처럼 개발하려는 목적에 따라 추상화 과정이 달라지는데 이를 문제영역에 의존적이라고 한다.
real world의 객체를 추상화를 통해 atribute와 behavior를 포함하는 class를 만들었다면, 이 클래스를 사용하기 위해 인스턴스를 만든다.
인스턴스는 실체화한다는 뜻으로 class를 특징으로 갖는 구체적인 무엇을 만드는 것이다.
인스턴스를 만드는 과정까지를 오브젝트 모델링이라 할 수 있다.
앞서 모델링은 개발하기 위한 기획안을 작성하는 과정이라 했다. 여기서는 실제 세계를 system화 하기 위한 기획을 했다는 뜻으로 해석할 수 있겠다.
그래서 Bean class를 오브젝트 모델링을 표현한 클래스라고 한다.
오브젝트 모델링이 끝나면 실제 OOPL(Object Oriented Programming Language)로 코드를 짜는데, 이 과정을 Implement라고 한다.
예를 들어 오브젝트 모델링에서는 사람 A, B, C는 학생이고, 남자이고, 공부한다는 행위를 하며, 사는 지역은 다르다고 추상화했다고 해보자.
추상화를 통해 클래스를 만들면 자연적으로 클래스간에 관계가 형성된다.
위의 예시에서는 사람 A, B, C가 학생이고, 남자이고 공부한다는 공통점을 가지고 있다.
이 공통점을 모아서 class를 만든다.
1 2 3 4 5 6 7 8 9 10 | public class Person{ //Field String job = "학생"; String gender = "남"; //Method public void study(){ System.out.println("공부했다"); } } | cs |
그리고 사람 A, B, C는 Person 클래스를 가지면서 지역이라는 차이점을 갖는다.
A, B, C는 Person 클래스를 "공유"한다. 이를 코딩에서는 상속받는다고 한다.
상속해주는 클래스, 공유되는 클래스를 상위 클래스라 하고, 상속받는 클래스, 공유받는 클래스를 하위 클래스라고 한다.
상위와 하위의 계층적 구조가 나타난다.
Implement 단계에서, 상속받는 키워드는 public 이클래스의이름 extends 상속받는클래스의이름 이다.
1 2 3 4 5 6 7 8 9 10 11 | public class A extends Person{ String location = "서울"; } public class B extends Person{ String location = "대구"; } public class C extends Person{ String location = "강릉"; } | cs |
이 되는 것이다. 그러면 Person 클래스에 있는 field String job, String gender와 method study(){}를 사용할 수 있으면서 각자 다른 정보 location을 갖게 된다.
이 때 자연적으로 클래스 간에 관계를 맺게 된다.
관계와 관련된 개념에는 Generalization, Specialization이 있다.
Generalization은 추상화 수준이 높다(구체적 내용이 없다)고 한다. 위의 예에서는 Student클래스는 Generalization된 클래스이다.
Specialization은 구체적이라는 의미이다. A, B, C클래스는 Person 클래스에 비해 구체적인 내용이 포함되어 있다고 할 때 쓰는 표현이다.
"구체화 된 하위의 클래스 is a 상위의 클래스" 라고 표현할 수 있는데, 예를 들면 A는 Person이다 라고 표현할 수 있다는 것이다.
앞서 Primitive 형변환에서 묵시적 형변환 내용을 생각해보면, 작은 크기의 데이터타입에서 큰 크기의 데이터타입으로 컴퓨터 내부적으로 형변환이 일어난다고 했었다.
class의 관계에 관해서는 개념적인 크기로 형변환이 가능하다고 생각하면 된다.
Person의 개념이 사람 A,B,C의 개념보다 크기 때문에
Person p = new A(); 됨
A a = new Person(); 안됨
A, B, C클래스타입에 Person 인스턴스를 대입할 수 없지만, Person 클래스 타입에 는 A, B, C를 대입할 수 있다.
이를 하위는 상위를 대신 할 수 있고 상위는 하위를 대신할 수 없다는 표현으로 한다.
공유 혹은 상속을 하는 이유는 같은 코드의 반복을 피하기 위함이다. 이에서 파생되는 특성 혹은 장점이 있다.
확장성: extends라는 키워드에서도 알 수 있듯이 상위의 클래스에 무언가를 더해 코딩하기 때문에 확장성을 특징으로 갖는다.
재사용성: 상위 클래스에 있는 내용을 하위 클래스에서 상속받으므로 하나의 클래스가 여러번 사용되는 재사용성을 특징으로 갖는다.
일관성: 상위 클래스를 수정하면 하위 클래스에 별다른 수정 없이도 일관적으로 적용된다. 만일 클래스를 추상화, 계층화하지 않고 만들었다면 만들어진 각각의 클래스에 같은 내용을 수정해야 한다.
유지 보수가 편하다: 상위 클래스의 기능에 무언가를 더하고 싶을 때 상위 클래스를 상속받아 하위 클래스를 만들면 상위클래스를 수정하지 않았으니 오류 발생 시 하위 클래스만 디버깅하면 된다. 만일 하나의 클래스에서 수정이 일어난다면 예기치 못한 오류를 수정할 일이 많아진다.
(객체지향프로그래밍은 위와 같은 장점, 특성이 있지만 충분한 분석설계와 고급 개발자가 필요하다는 것이 단점이다.)
2019/02/27 - [IT/JAVA 공부] - [JAVA] system 개발 절차, "플랫폼 독립적"의 의미, 환경변수 잡는 이유
2019/03/03 - [IT/JAVA 공부] - [JAVA] Class path, Byte code, Data type, Operator
2019/03/04 - [IT/JAVA 공부] - [JAVA] 연산자, 주석문, switch, for, while, 배열
'IT > 공부' 카테고리의 다른 글
[프로그래밍] 생성자, 공유, super, this, OverRiding, package (0) | 2019.03.17 |
---|---|
[프로그래밍] 객체지향, 메서드 문법, OverLoading, getter 메서드 (0) | 2019.03.17 |
[프로그래밍] 연산자, 주석문, switch, for, while, 배열 (0) | 2019.03.04 |
[프로그래밍] Class path, Byte code, Data type, Operator (0) | 2019.03.03 |
[프로그래밍] 개념잡기: 컴퓨터 구조, 용어 정리 (0) | 2019.02.27 |