자바를 배우기 전에 HTML을 잠깐 했었는데, 그 때마다 태그에 관해서 부모와 자식이라는 단어를 많이 사용했었다. 처음엔 이해하기 쉬우라고 예를 들어 설명하는 줄 알았지만 지금까지 배워오니 그 관계를 깨닫는 것이 얼마나 중요한 부분인지를 알게 되었다. 여기서 상속이란, 부모가 자식에게 넘겨주는 그 상속을 일컫는 것이 맞다. 부모가 가지고 있는 기존의 코드나 변수를 그대로 물려줌으로써 불필요한 중복을 피하고, 코드문을 간결하게 만들 수 있다. 여기서 상속을 받는 클래스는 자식 클래스가 되며, 물려주는 클래스는 부모 혹은 조상 클래스가 된다.

클래스를 생성할 때 extends를 사용하여 상속을 할 수 있다. (단, 한 번의 상속만 가능하다. 다중상속 X)
class (자식이 될 클래스 명) extends (부모가 될 클래스 명) {  }

 

 

   Student 클래스와 Teacher 클래스에 exam_40_per 클래스를 상속하자, 메인 함수에서 불러올 때 자식의 참조변수를 통해 불러냈음에도 부모요소가 가지고 있던 함수의 값이 그대로 출력되었다. 부모가 가지고 있는 변수와 함수 모두 자식이 사용할 수 있도록 상속이 일어난 것이다. 하지만 반대의 경우는 호출할 수 없다, 부모는 자식이 가진 함수나 변수를 사용할 수 없다는 의미다. 그렇다면 만약 자식의 클래스에서는 부모의 함수나 변수를 바꿔 출력하고 싶을 경우에는 어떻게 해야할까.

 

 

   생성자를 만들 때, 혹은 중복된 이름의 함수를 작성할 때 오버로딩이 쓰였던 것을 기억하자. 여기서 자식이 부모의 함수를 가져와 새로 작성하는 것오버라이딩이라고 한다. 주로 프로젝트(협업)을 위해 사용되거나 이후에 배울 다향성에 관해서 주로 사용되는 기능이다. 지금 여기서는 부모가 가진 메서드를 자식이 이름만 들고와 다른 기능으로 바꿀 수 있다는 것을 알아두자.

(물론, 자식에서 바꾼 것이기 때문에 부모가 가진 메서드 자체가 바뀌는 것은 아니다)

 

   Leader클래스에서 오버라이딩 한 say() 함수를 살펴보자. 출력문을 바꾼 것과 동시에, super를 사용하여 다시 한 번 같은 함수를 호출하고 있다. this를 기억한다면 이해하기 쉬운데, super는 해당 클래스의 부모 요소를 직접적으로 안내해주는 참조변수와 같다. this는 해당 클래스, super는 해당 클래스의 부모를 가리키는데, 부모의 sya()를 실행하라는 뜻이므로 Leader의 함수 say()를 불러오면 "선생님께 인사" 와 "선생님, 안녕하세요" 가 둘 다 출력되게 된다.

 

   그렇다면 상속받은 부모와 자식 관계에서 생성자에는 변함이 없을까? 만약 부모가 존재하지 않는 상태인데 자식만 존재하는 상태가 될 수 있을까, 정답은 그렇지 않다. 그래서 우리는 상속받은 클래스에 한해서 부모 생성자를 포함시켜주어야 하는데 보통 생략하면 프로그램 내에서 자동으로 추가해주기는 한다. 하지만 정석으로는 super(); 생성자를 자식 클래스 생성자 안에 포함시켜주는게 맞다. 그래야 자식 클래스가 객체화 되었을 때, 부모도 같이 존재하는 상태가 되기 때문이다.

 

 

   그렇다면 이를 응용한 문제를 확인해보자. SportsCar라는 클래스가 Car2를 상속받은 상태가 되었고, 각 클래스에는 필요한 변수와 함수가 나열되어 있다. 여기서 Car2의 생성자는 파라미터를 받을 수 있는 형태로 만들어져 있고, SportsCar 역시 필요한 파라미터를 받아 초기화 할 수 있는 생성자를 만들었다. 하지만 생성할 수 없다며 에러가 떴다. 그 이유는 Car2의 생성자는 color값을 받아 초기화하는 생성자만 있기 때문이었다. 기본적으로 자식 클래스 생성자는 부모 클래스의 기본형태의 생성자가 자동으로 들어간다. 하지만 Car2의 생성자를 보면 기본생성자가 없기 때문에 초기화를 받을 값이 없다며 에러가 뜨는 상태였다. 이를 해결하기 위해선 Car2에 기본 생성자를 만들어주거나, 아니면 부모 생성자 안에 파라미터 값을 입력해주면 에러없이 정상적으로 만들어지는 것을 확인할 수 있다.

 

   하지만 SportCar 생성자에서 드는 의문이 하나 있을 것이다. 바로 color라는 변수를 가지고 있지 않음에도 this를 사용하여 변수의 초기화를 진행하자 아무런 에러가 뜨지 않은 것인데, 이는 부모의 변수도 함께 상속받음으로써 SportsCar 클래스 내에 부모의 변수가 존재하기 때문이다. 그래서 super를 써도 불러올 수 있지만, this로도 불러올 수 있는 것이다.

(니것도 내것 내것도 내것)

 

 

'아이티에듀넷' 카테고리의 다른 글

2024-09-19 :: 039 함수 정리하기  (0) 2024.09.19
2024-09-13 :: 038 객체의 다형성  (0) 2024.09.13
2024-09-11 :: 036 String에 관하여  (0) 2024.09.11
2024-09-10 :: 035 생성자  (0) 2024.09.10
2024-09-09 :: 034 객체  (0) 2024.09.09
String : java에서 문자열을 담을 때 사용하는 변수, 큰따옴표(" ") 안에 내용을 입력하여 사용한다.

 

   기존에 알고있던 String에 대한 개념이다. int는 정수, float는 실수, char는 문자, boolean은 논리 등 변수를 선언하기 위해 앞에 붙는 데이터 타입처럼 String 또한 문자열에 대한 데이터 타입처럼 취급되어 사용된다. 하지만 실제 이클립스에 입력을 하게 되면 혼자만 데이터 타입이 조금 다르다는 것을 알 수 있다.

 

   이렇듯 입력하게 되면 표시되는 색상이 혼자만 다른데, 이는 바로 String은 객체(클래스)에 속하기 때문이다.

   함축된 표현 방식을 쓰기 전 모양새를 살펴보면 마치 인스턴스를 생성하여 참조변수에 주소값을 담던 방식과 비슷하다. 비슷할 뿐 아니라 실제로도 그렇게 동작하기 때문인데 그렇다면 하나 의문점이 생길 것이다. 바로 참조변수는 해당 객체가 생성될 때 부여받은 주소값을 저장한다는 부분이다. 이를테면 한 클래스를 인스턴스화 시켜 참조변수에 해당 주소값을 담았다 치자. 그리고 그 값을 콘솔창에 불러오게 되면 @표시가 붙은 뒤로 영어와 숫자의 조합으로 이루어진 주소가 나타나게 될 것이다. 즉, 참조변수 자체로는 해당 객체가 가지고 있는 특정 값을 표시한다거나 할 수 없다는 얘기다.

 

   하지만 이렇게 String 변수를 콘솔창에 불러내보면 text라는 변수에는 마치 문자열이 담긴 것 마냥 출력이 되는 것을 확인할 수 있다. 사실 깊게 들어가기에는 아직 배움이 얕아 정확하게 설명을 해낼 순 없지만, 일단 String은 객체가 맞긴 하나 해당 참조변수는 자동적으로 String의 매개변수에 담긴 데이터 값을 참조하여 일반 변수처럼 동작한다는 것이다.

 

   즉, String 타입을 가진 변수는 참조변수라 할 수 있으며 그로 인해 함수를 호출하여 사용할 수 있다. String은 일단 문자열을 파라미터로 받는다. 여기서 charAt이란, 하나의 문자가 여러개 이어져 만들어진 문자열 중에 한 글자를 하나의 인덱스로 보고 해당 위치로 찾아가 반환하는 함수이다. 위에서는 0번째 인덱스를 출력하라 명령했고 그 결과 '안'이라는 글자가 나왔다. length는 배열 객체에서도 자주 사용하다 싶이, 객체가 가진 길이를 뜻한다. charAt으로 한 글자씩 가져오는 것이 가능했다는 것은 글자 하나하나를 인덱스로 볼 수 있다는 의미다. 그래서 "안녕하세요"의 길이 5를 반환한 것이다.

 

   그렇다면 이제 문제의 비교연산자 구문을 확인해보자. 첫번째는 equals() 함수를 사용했고 두번째는 다른 변수의 값을 비교하는 것처럼 비교연산자를 사용하였다. 하지만 같은 문자열을 제시했음에도 두 개의 값이 다른데 그 이유가 바로 String이 일반 변수가 아니라는 뜻이 된다.

 

   Call by value, 일반 변수는 기본적으로 어떤 메서드에 사용되거나 호출이 될 때 변수에 들어있는 값을 그대로 꺼내어 가져오게 된다. 정수, 실수, 논리, 문자가 그러하게 동작하기 때문에 비교연산자를 사용하여 제어문을 쓰거나 반복문을 쓰는 것이 가능한데 String은 그렇지 않다. 일단 객체기 때문이다. 출력할 때 데이터 값을 참조하여 나타내는 참조변수, 즉 해당 변수에 담긴 값은 "안녕하세요" 라는 문자열이 아니라 정확히는 그 문자열이 담긴 주소를 나타내는 것이 된다. 그렇기 때문에 비교연산자로 문자열을 비교하게 되면 주소와 문자열을 비교하는 것이 되기 때문에 대부분의 논리값은 false가 나오게 될 것이다.

(간혹 true가 뜨기도 한다지만 추천하는 방법이 아니다)

 

   그렇다면 문자열을 비교할 방법은 없는 것일까? 그건 아니다. 위에 방법대로 equals 함수를 통해 비교하는 건 가능하다. 이는 해당 객체 안에 존재하는 "안녕하세요" 라는 값을 꺼내어 직접 문자열을 대조하기 때문에 비교가 가능하게 되는 것이다. 그래서 함수를 통해 콘솔창에 불러냈을 때는 true값이 뜨게 되고, 비교연산자를 썼을 경우에는 false가 나오게 된 것이다. 이렇듯 객체 내에서 값을 바꾸거나 참조하는 경우는 Call by reference 라고 한다. 모든 객체가 이러한 방식으로 동작하지만 String은 어딘가 예외인 것처럼 돌아가는 것이 어렵기도 하면서 이해가 되는 것 같기도 하다….

 

   그렇다면 이제 진짜 String의 정체(?)와 사용방법에 대해 알게 되었으니 응용을 해보도록 하자.

'아이티에듀넷' 카테고리의 다른 글

2024-09-13 :: 038 객체의 다형성  (0) 2024.09.13
2024-09-12 :: 037 객체의 상속  (0) 2024.09.12
2024-09-10 :: 035 생성자  (0) 2024.09.10
2024-09-09 :: 034 객체  (0) 2024.09.09
2024-09-06 :: 033 반복문과 배열 변수  (1) 2024.09.06

 

Java 프로그래밍을 하기 앞서 개발에 도움이 되는 밑거름...

자바 개발 도구를 다운받고 이를 사용할 수 있도록 설정하는 것 까지 해보려고 한다.

 

먼저 들어가기 앞서 정보용으로 작성된 포스터가 아니며, 개발 공부를 위해 개인적으로 되짚는 글임을 알립니다. 


 

   1. 다운받고자 하는 개발키트 버전 확인 후 파일 다운로드 (JDK SE 17)   

 

Java Archive Downloads - Java SE 17

WARNING: Older versions of the JDK are provided to help developers debug issues in older systems. They are not updated with the latest security patches and are not recommended for use in production. For production use Oracle recommends downloading the late

www.oracle.com

사용하는 운영체제에 맞는 파일을 다운받으면 된다.

압축파일을 다운받은 후, 경로를 지정하기 편한 곳에 압축을 풀어둔다.

 

 

 

   2. 제어판 - 시스템 환경 변수 편집   

 

환경 변수(N)... 에 들어가면 나오는화면에서 Path를 선택한다.

 

 

새로 만들기(N) 버튼을 누른 후, JDK의 bin파일이 있는 주소를 입력해주고 확인을 누른 뒤 빠져나온다.

 

 

 

   3. 설치 확인하기   

이제 제대로 위치가 잡혀 있는지 확인하기 위해 CMD를 열어 확인해본다.

(하지만 요즘 윈도우는 기본적으로 설정을 해주지 않아도 알아서 잘 잡는다고는 한다...)

 

창에 java -version을 입력하자 17버전을 인식하는 것을 확인할 수 있다.

 


 

이번에는 이미 설정 된 17버전을 지우고 21버전을 설치해보도록 하겠다.

일단 설치하기 앞서 설정된 환경변수를 지워보자.

 

 

 다시 시스템 환경 변수 편집에 들어가 Path에 추가했던 파일 경로를 삭제한다.

 

 

Download the Latest Java LTS Free

Subscribe to Java SE and get the most comprehensive Java support available, with 24/7 global access to the experts.

www.oracle.com

 

설치하고자 하는 파일을 다운받고 압축을 푼다.

 

 

새로 받은 JDK의 bin파일 위치를 Path에 새로 만들어준다.

 

 

CMD로 잘 잡혀 있는지 확인한다.

 

필자는 개발 공부하는 동안 17버전을 써야 하기 때문에 등록했던 21버전을 지우고 다시 17버전으로  만들어 두었는데 확인해보니 17버전으로 잘 잡혀 있는 것 까지 확인했다 ^-^ 

+ Recent posts