목록Java (8)
youngfromnowhere
singleton 패턴으로 작성된 class를 처음 봤을 때 든 의문이 있다. class 정의의 body 안에 자기 자신의 instance를 만들면 그 instance 안에도 instance가 생성되고 그 안에도 생성되고.. 하면서 무한 loop가 발생하지 않을까? 하는 의문. 결론부터 말하자면 instance는 static제어자로 인해 static area에 단 한개 생성된다. (외부에서 동적으로 객체를 생성하는 것은 생성자에 대한 접근을 private으로 제어하여 차단된다.) 그렇다면 일부러 무한 loop를 발생시킬 수 있을까? MyClass는 body 안에서 자신의 instance를 생성하는데, 이 때 instance는 not-static이므로, MyClass의 instance인 c 내부에도 객체변..
함수를 호출할 때 함수에 '무엇을' 전달하느냐에 따라 함수 호출방식을 Call-by-Value, Call-by-Address, Call-by-Reference로 나눈다. Call-by-Value. 함수에 어떤 변수의 값을 전달한다. 함수는 값을 전달받았을 뿐이므로 함수 외부의 메모리에 영향을 끼치지 못한다. 먼저 A class를 정의한다. a1.value, a2.value에 1, 2를 저장하고 swap method를 호출할 때는(line 7) 각 객체변수들의 값을 전달하였다. swap method 내부에서 각 값을 a1, a2라는 로컬변수로 받고 그 값을 swap한다. 그 결과, swap method 내부에서는 a1, a2의 값이 바뀌었지만 swap method 외부의 a1.value, a2.value에..
팀 프로젝트의 요구사항중 정규표현식을 이용하여 예외처리를 하라는 것이 있었다. 이에따라 위와 같이 먼저 regEx 패키지에 여러 형식들을 저장한 뒤, 입력값들이 해당 형식에 부합하는지 확인하고 부합하지 않으면 예외를 던지도록 해두었다. 형식에 맞지 않는 값을 입력했을 경우, 팀원들의 테스트에서는 에러메세지가 정상적으로 출력되었다. 그러나 터미널에서 내가 테스트했을 때는 에러메세지가 뜨지 않고 화면만 초기화되었다. 원인은 Menu를 화면에 출력하기 전에 화면을 청소하기 위해 MainMenu()에서 호출하는 clearScreen()이었다. 화면에 메인 메뉴를 출력하기 전에 콘솔화면을 청소하기 위해 clearScreen() 메소드가 추가되어 있다. https://www.javatpoint.com/how-to-..
https://youngnowhere.tistory.com/37 [Java] 수동 컴파일할 때, 소스코드 수정사항이 반영되지 않는 경우 https://youngnowhere.tistory.com/36 [Git] 원격저장소 clone 후 Java compile 오작동 Git, Github으로 미니프로젝트를 진행하다가.. compile에 수정사항이 반영되지 않는것을 발견했다. 또, 한 branch에서 생성된 class fi youngnowhere.tistory.com 위 글에서 Java 컴파일러는 '직접 임포트된' 소스코드가 수정되지 않는 한 '간접적으로 임포트된' 소스코드를 다시 컴파일 하는게 아니라 이미 만들어진 클래스 파일을 불러오기만 한다는 점을 살펴봤다. Test01.java와 Test02.java..
https://youngnowhere.tistory.com/36 [Git] 원격저장소 clone 후 Java compile 오작동 Git, Github으로 미니프로젝트를 진행하다가.. compile에 수정사항이 반영되지 않는것을 발견했다. 또, 한 branch에서 생성된 class file이 merge하지 않은 다른 branch에서 보인다거나 (로컬에서 확인한 결과 youngnowhere.tistory.com 이 글은 위 포스팅의 원인을 분석한 글이다. Java Compiler는 '간접적으로' import된 class에 대해서는 기존에 생성된 class file을 불러오기만 할 뿐, 새롭게 컴파일 하지 않는것 같다. 실험해보자. Test/ 디렉토리에 Main.java와 TestPackage01, Test..
추상클래스를 작성하고자 할 때, 딱히 abstract 제어자를 쓰지 않고 그냥 내용만을 비워둘 수도 있다. 다만 이렇게 하면 인스턴스를 만들 때 에러를 띄우지 않는다. 다시 말하면 abstract 제어자는 해당 클래스의 인스턴스를 만들지 못하게 함으로써 오로지 상속을 통해서만 쓰이도록 강제하는 역할을 한다. (abstract method의 경우도 abstract 제어자는 상속 클래스에서 override를 통해 반드시 구현되도록 강제하는 역할을 한다.) package AbPrac2; class Bird { void test_method() {} } abstract class Phone { abstract void test_method2(); } public class Main { public static ..
점수를 입력받아서 if-else if 문을 통해 등급을 메기는 코드를 작성하려고 한다. 그런데 이 때 논리 연산자인 &&을 bitwise-and인 &으로 바꾸어도 결과가 같다는 것을 알게 된다. public class score { static char bitwise_method(int score) { if (score >= 91 & score = 81 & score = 71 & score = 91 && score = 81 && score = 71 && score
Primitive type의 변수를 쓸 때는 선언(declare)하고 초기화(initialize)를 해주면 되는데, Reference type의 변수는 중간에 '생성(create)'이라는 과정을 거쳐주어야 한다. 왜? Reference type(참조변수)이란 말그대로 다른 어떤 객체(값)가 저장되어 있는 memory address를 저장하는 변수이기 때문이다. 참조변수의 선언은 memory address를 저장할 변수를 선언할 뿐이기 때문에 우리가 원하는대로 변수를 사용하려면 해당 type(class)의 객체를 생성하여 할당해야 한다. //Declare myType var_name; //Create var_name = new myType() Array 또한 reference type이기 때문에 선언 후 ..